繁体   English   中英

选择两个日期之间的 Pandas 数据框行

[英]Select Pandas dataframe rows between two dates

我正在处理两个表,如下所示:

  • 第一个表 df1 给出了速率和有效期:
rates = {'rate': [ 0.974, 0.966,  0.996,  0.998,  0.994, 1.006,  1.042,  1.072,  0.954],
'Valid from': ['31/12/2018','15/01/2019','01/02/2019','01/03/2019','01/04/2019','15/04/2019','01/05/2019','01/06/2019','30/06/2019'],
'Valid to': ['14/01/2019','31/01/2019','28/02/2019','31/03/2019','14/04/2019','30/04/2019','31/05/2019','29/06/2019','31/07/2019']}

df1 = pd.DataFrame(rates)
df['Valid to'] = pd.to_datetime(df['Valid to'])
df['Valid from'] = pd.to_datetime(df['Valid from'])


    rate    Valid from  Valid to
0   0.974   2018-12-31  2019-01-14
1   0.966   2019-01-15  2019-01-31
2   0.996   2019-01-02  2019-02-28
3   0.998   2019-01-03  2019-03-31
4   0.994   2019-01-04  2019-04-14
5   1.006   2019-04-15  2019-04-30
6   1.042   2019-01-05  2019-05-31
7   1.072   2019-01-06  2019-06-29
8   0.954   2019-06-30  2019-07-31   


  • 第二个表 df2 列出记录的金额和相应的日期
data = {'date': ['03/01/2019','23/01/2019','27/02/2019','14/03/2019','05/04/2019','30/04/2019','14/06/2019'],
'amount': [200,305,155,67,95,174,236,]}

df2 = pd.DataFrame(data)
df2['date'] = pd.to_datetime(df2['date'])


    date        amount
0   2019-03-01  200
1   2019-01-23  305
2   2019-02-27  155
3   2019-03-14  67
4   2019-05-04  95
5   2019-04-30  174
6   2019-06-14  236

目标是使用迭代并基于 df2 上的日期从 df1 检索 df2 上每一行的适用费率。

示例:df2 中第一行的日期是 2019-01-03,因此适用的比率为 0.974

此处给出的解释( https://www.interviewqs.com/ddi_code_snippets/select_pandas_dataframe_rows_between_two_dates )让我了解了如何在 df1 中的两个日期之间检索 df2 上的行。

但是我没有设法使用迭代从 df1 检索到 df2 上每一行的适用率。

如果您的数据框不是很大,您可以简单地在一个虚拟键上进行连接,然后进行过滤以将其缩小到您需要的范围。 请参见下面的示例(请注意,我必须稍微更新您的示例才能获得正确的日期格式)

import pandas as pd

rates = {'rate': [ 0.974, 0.966,  0.996,  0.998,  0.994, 1.006,  1.042,  1.072,  0.954],
'valid_from': ['31/12/2018','15/01/2019','01/02/2019','01/03/2019','01/04/2019','15/04/2019','01/05/2019','01/06/2019','30/06/2019'],
'valid_to': ['14/01/2019','31/01/2019','28/02/2019','31/03/2019','14/04/2019','30/04/2019','31/05/2019','29/06/2019','31/07/2019']}

df1 = pd.DataFrame(rates)
df1['valid_to'] = pd.to_datetime(df1['valid_to'],format ='%d/%m/%Y')
df1['valid_from'] = pd.to_datetime(df1['valid_from'],format='%d/%m/%Y')

那么你df1将是

        rate    valid_from  valid_to
    0   0.974   2018-12-31  2019-01-14
    1   0.966   2019-01-15  2019-01-31
    2   0.996   2019-02-01  2019-02-28
    3   0.998   2019-03-01  2019-03-31
    4   0.994   2019-04-01  2019-04-14
    5   1.006   2019-04-15  2019-04-30
    6   1.042   2019-05-01  2019-05-31
    7   1.072   2019-06-01  2019-06-29
    8   0.954   2019-06-30  2019-07-31

这是您的第二个数据框df2

data = {'date': ['03/01/2019','23/01/2019','27/02/2019','14/03/2019','05/04/2019','30/04/2019','14/06/2019'],
'amount': [200,305,155,67,95,174,236,]}

df2 = pd.DataFrame(data)
df2['date'] = pd.to_datetime(df2['date'],format ='%d/%m/%Y')

那么您的df2将如下所示

     date   amount
0   2019-01-03  200
1   2019-01-23  305
2   2019-02-27  155
3   2019-03-14  67
4   2019-04-05  95
5   2019-04-30  174
6   2019-06-14  236

您的解决方案:

df1['key'] = 1
df2['key'] = 1
df_output = pd.merge(df1, df2, on='key').drop('key',axis=1)
df_output = df_output[(df_output['date'] > df_output['valid_from']) & (df_output['date'] <= df_output['valid_to'])]

这就是结果如何df_output

    rate    valid_from  valid_to    date    amount
0   0.974   2018-12-31  2019-01-14  2019-01-03  200
8   0.966   2019-01-15  2019-01-31  2019-01-23  305
16  0.996   2019-02-01  2019-02-28  2019-02-27  155
24  0.998   2019-03-01  2019-03-31  2019-03-14  67
32  0.994   2019-04-01  2019-04-14  2019-04-05  95
40  1.006   2019-04-15  2019-04-30  2019-04-30  174
55  1.072   2019-06-01  2019-06-29  2019-06-14  236

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM