选择两个日期之间的 Pandas 数据框行
Posted
技术标签:
【中文标题】选择两个日期之间的 Pandas 数据框行【英文标题】:Select Pandas dataframe rows between two dates 【发布时间】:2020-04-29 03:05:53 【问题描述】:我正在处理如下两个表:
第一个表格 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)
df1['Valid to'] = pd.to_datetime(df1['Valid to'])
df1['Valid from'] = pd.to_datetime(df1['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 上每一行的适用率。
【问题讨论】:
看起来您需要合并?不迭代? @Datanovice 确实,但是如果我没有要加入的列,我怎么能合并? @Brahms 如果它回答了您的问题,请单击下面的复选标记以获取答案?谢谢。 【参考方案1】:如果您的数据框不是很大,您可以简单地在一个虚拟键上进行连接,然后进行过滤以将其缩小到您需要的范围内。请参阅下面的示例(请注意,我必须稍微更新您的示例以具有正确的日期格式)
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
【讨论】:
我能在这里得到一点帮助吗? ***.com/questions/59699910/… 这是一个非常有限的方法,因为它适合(正如你提到的,只有小数据帧)你会为更大的数据帧做什么?第一次合并中的重复将杀死内存...以上是关于选择两个日期之间的 Pandas 数据框行的主要内容,如果未能解决你的问题,请参考以下文章
Pandas:从 Pandas DataFrame 中选择两个日期之间的所有数据