Python 如何基于df1中的日期将两个数据帧连接到>;=df2中的日期

Python 如何基于df1中的日期将两个数据帧连接到>;=df2中的日期,python,pandas,join,Python,Pandas,Join,我有一个带有关键ID、状态、开始日期和其他特征的大数据帧。我还有另一个数据框,上面有状态、开始日期和一个“1”表示标志 我想加入这两个,因为状态和df1中的日期大于或等于df2中的日期 以下面的例子为例df1是状态表、开始日期和标志的1df2是一个数据帧,如果df2中的日期是=df1中的日期,则需要这些标志。最终结果是df3。唯一的观测结果是状态匹配且日期为原始日期的标志 import pandas as pd dict1 = {'date':['2020-01-01', '2020-02-1

我有一个带有关键ID、状态、开始日期和其他特征的大数据帧。我还有另一个数据框,上面有状态、开始日期和一个“1”表示标志

我想加入这两个,因为状态和df1中的日期大于或等于df2中的日期

以下面的例子为例
df1
是状态表、开始日期和标志的1
df2
是一个数据帧,如果df2中的日期是
=
df1中的日期,则需要这些标志
。最终结果是
df3
。唯一的观测结果是状态匹配且日期为原始日期的标志

import pandas as pd

dict1 = {'date':['2020-01-01', '2020-02-15', '2020-02-04','2020-03-17',
                 '2020-06-15'],
         'state':['AL','FL','MD','NC','SC'],
         'flag': [1,1,1,1,1]}
df1 = pd.DataFrame(dict1)
df1['date'] = pd.to_datetime(df1['date'])

dict2 = {'state': ['AL','FL','MD','NC','SC'],
         'keyid': ['001','002','003','004','005'],
         'start_date':['2020-02-01', '2020-01-15', '2020-01-30','2020-05-18',
                       '2020-05-16']}
df2 = pd.DataFrame(dict2)
df2['start_date'] = pd.to_datetime(df2['start_date'])

df3 = df2
df3['flag'] = [0,1,1,0,1]
如何以编程方式访问df3?我的实际
df1
每个状态都有一行。我实际的
df2
有超过一百万个不同日期的观察结果。

使用和:

用于按参数按更大或相等的日期时间进行合并
direction='forward'

“向前”搜索选择右数据帧中的第一行,其“开”键大于或等于左键

您还可以
重命名
列,以避免在输出
数据帧中追加:

df2['need'] = [0,1,1,0,1]

df1 = df1.sort_values('date')
df2 = df2.sort_values('start_date')

df = pd.merge_asof(df2, 
                   df1.rename(columns={'date':'start_date'}), 
                   on='start_date', 
                   by='state',
                   direction='forward')

df['flag'] = df['flag'].fillna(0).astype(int)
print (df)
  state keyid start_date  need  flag
0    FL   002 2020-01-15     1     1
1    MD   003 2020-01-30     1     1
2    AL   001 2020-02-01     0     0
3    SC   005 2020-05-16     1     1
4    NC   004 2020-05-18     0     0
df2['need'] = [0,1,1,0,1]

df1 = df1.sort_values('date')
df2 = df2.sort_values('start_date')

df = pd.merge_asof(df2, 
                   df1, 
                   left_on='start_date', 
                   right_on='date', 
                   by='state',
                   direction='forward')


df['flag'] = df['flag'].fillna(0).astype(int)
print (df)

  state keyid start_date  need       date  flag
0    FL   002 2020-01-15     1 2020-02-15     1
1    MD   003 2020-01-30     1 2020-02-04     1
2    AL   001 2020-02-01     0        NaT     0
3    SC   005 2020-05-16     1 2020-06-15     1
4    NC   004 2020-05-18     0        NaT     0
df2['need'] = [0,1,1,0,1]

df1 = df1.sort_values('date')
df2 = df2.sort_values('start_date')

df = pd.merge_asof(df2, 
                   df1.rename(columns={'date':'start_date'}), 
                   on='start_date', 
                   by='state',
                   direction='forward')

df['flag'] = df['flag'].fillna(0).astype(int)
print (df)
  state keyid start_date  need  flag
0    FL   002 2020-01-15     1     1
1    MD   003 2020-01-30     1     1
2    AL   001 2020-02-01     0     0
3    SC   005 2020-05-16     1     1
4    NC   004 2020-05-18     0     0