根据另一个数据框列中的datetime值创建另一个数据框datetime列

时间:2020-06-24 10:12:25

标签: python pandas dataframe

我有一个带有datetime列的数据框,可以将其称为my_dates。

我还有一个日期列表,在这个示例中有5个日期。

15th Jan 2020
20th Mar 2020
28th Jun 2020
20th Jul 2020
8th Aug 2020

我想做的是在datframe中创建另一列,该列将查看my_dates列中的datetime,并且该列要小于我的日期列表中的日期,以使其采用该值。

例如,让我们说这个例子是2020年6月23日。我希望新列具有2020年6月28日这一行的值。希望下面的例子很清楚。

 More examples

 my_dates             expected_values

 14th Jan 2020        15th Jan 2020
 15th Jan 2020        15th Jan 2020
 16th Jan 2020        20th Mar 2020
 ...                  ...
 19th Mar 2020        20th Mar 2020
 20th Mar 2020        20th Mar 2020
 21st Mar 2020        28th Jun 2020

执行此操作而不是执行循环操作最有效的方法是什么?

2 个答案:

答案 0 :(得分:2)

IIUC,您需要pd.merge_asof并将参数direction设置为forward

dates = ['15th Jan 2020',
'20th Mar 2020',
'28th Jun 2020',
'20th Jul 2020',
'8th Aug 2020'   ]

dates_proper = [pd.to_datetime(d) for d in dates]

df = pd.DataFrame(pd.date_range('14-01-2020','21-03-2020'),columns=['my_dates'])
df1 = pd.DataFrame(dates_proper,columns=['date_list'])

merged_df = pd.merge_asof(
    df, df1, left_on=["my_dates"], right_on=["date_list"], direction="forward"
)

print(merged_df)

     my_dates  date_list
0  2020-01-14 2020-01-15
1  2020-01-15 2020-01-15
2  2020-01-16 2020-03-20
3  2020-01-17 2020-03-20
4  2020-01-18 2020-03-20
..        ...        ...
63 2020-03-17 2020-03-20
64 2020-03-18 2020-03-20
65 2020-03-19 2020-03-20
66 2020-03-20 2020-03-20
67 2020-03-21 2020-06-28

答案 1 :(得分:2)

最后是pd.merge_asof的用例! :)从文档中

执行asof合并。这类似于左联接,除了我们匹配最近的键而不是相等的键。

这样可以使您的示例可重复进行:

In [12]: reference = pd.DataFrame([['15th Jan 2020'],['20th Mar 2020'],['28th Jun 2020'],['20th Jul 2020'],['8th Aug 2020']], columns=['reference']).astype('datetime64')  
In [13]: my_dates = pd.DataFrame([['14th Jan 2020'], ['15th Jan 2020'], ['16th Jan 2020'], ['19th Mar 2020'], ['20th Mar 2020'],['21th Mar 2020']], columns=['dates']).astype('datetime64')                        
In [15]: pd.merge_asof(my_dates, reference, left_on='dates', right_on='reference', direction='forward')                                                                                                            
Out[15]: 
       dates  reference
0 2020-01-14 2020-01-15
1 2020-01-15 2020-01-15
2 2020-01-16 2020-03-20
3 2020-03-19 2020-03-20
4 2020-03-20 2020-03-20
5 2020-03-21 2020-06-28