2017-10-21 73 views
-1

我有以下两个数据框。 DF1:python找到附近的日期 - 3例

date  customers 
2017-10-09  8 
2017-10-10  5 
2017-10-11  4 
2017-10-12  8 
2017-10-13  9 
2017-10-16  1 

DF2:

date   manager prev_day next_day on_or_next_day 
2017-10-10 george 
2017-10-14 fred 

我需要一个函数,将在DF2完成剩余的三列。列的逻辑是这样的: prev_day - 在df1之前发生在df1之前的日期['date'] next_day - 在df1之后在df1发生的下一个日期['date'] on_or_next_day - if df2 [''日期']在DF1然后把该否则可用的下一个日期DF1

基于功能上面的例子应该返回DF2如下:

date   manager prev_day next_day  on_or_next_day 
2017-10-10 george 2017-10-09 2017-10-11 2017-10-10 
2017-10-14 fred  2017-10-13 2017-10-16 2017-10-16 

正如上面你会发现,周末是排除在这个例子,但在真实的数据框中有几天,当商店被关闭等等,所以使用BDay或类似的东西不起作用,你需要从日期列表d F2。

任何你不确定的事情,请随时询问,因为我一直在争取这个多年,现在不能得到一个pythonic解决方案。

+0

获得“pythonic解决方案”本身并不是目的。如果您有任何解决方案,那没关系,请在[codereview.se]询问是否可以根据需要进行改进。 –

+0

不清楚你在问什么。为了解决你的问题(那么它的主题太宽泛/基于观点/未来的读者没用(因为问题不是反复出现的))?遇到某个特定位的问题(然后重新提出问题以询问位并将您的任务作为背景细节)? –

回答

2

我单独做用merge_asof

df['NewDate']=df.date 

NEXT_DAY:

pd.merge_asof(df1,df.drop('customers',1),on='date',direction='forward',allow_exact_matches =False).rename(columns={'NewDate':'next_day'}) 
    Out[136]: 
      date manager next_day 
    0 2017-10-10 george 2017-10-11 
    1 2017-10-14 fred 2017-10-16 

prev_day:

pd.merge_asof(df1,df.drop('customers',1),on='date',direction='backward',allow_exact_matches =False).rename(columns={'NewDate':'prev_day'}) 
Out[138]: 
     date manager prev_day 
0 2017-10-10 george 2017-10-09 
1 2017-10-14 fred 2017-10-13 

on_or_next_day:

pd.merge_asof(df1,df.drop('customers',1),on='date',direction='forward',allow_exact_matches =True).rename(columns={'NewDate':'on_or_next_day'}) 
Out[141]: 
     date manager on_or_next_day 
0 2017-10-10 george  2017-10-10 
1 2017-10-14 fred  2017-10-16