我有一个名为 df1
的数据框,如下所示:
Loc Start End
CA 2013-11-08 2014-04-14
CO 2014-04-14 2014-04-16
CA 2014-04-16 2014-04-18
CO 2014-04-18 2014-04-23
我有另一个名为 df2
的数据框,如下所示:
Date Loc Flag
2014-04-14 CO 0
2014-04-14 CO 0
2014-04-14 CO 0
2014-04-15 CO 0
2014-04-15 CO 0
2014-04-16 CO 0
2014-04-16 CO 0
2014-04-16 VA 0
2014-04-16 CA 0
我想构建一个函数,以便对于 df1
中的每个 Start
和 End
周期,该函数检查 >df2
落在该日期范围内的匹配位置,即进行 loc
的匹配。如果它们不匹配,我希望 Flag
标记为 1。这是我尝试过的代码:
for i in range(len(df1)):
for j in range(len(df2)):
if df2['Date'][j] <= df1['End Date'][i] and \
df2['Date'][j] >= df1['Start Date'][i]:
if df2['Loc'][j] != df1['Loc'][i]:
df2['flag'][j] = 1
我的代码在位置实际匹配的位置放置 1。我认为这是因为 Start
和 End
日期重叠。关于如何纠正这个问题有什么建议吗?谢谢您
最佳答案
更简单的解决方案是使用 merge_asof。这与左连接类似,只是我们匹配最近的键而不是相等的键。这里有更多:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.merge_asof.html
df1['interval'] = pd.to_datetime(df1['start_date'])
df2['interval'] = pd.to_datetime(df2['Date'])
df1.sort_values(by=['interval'])
df2.sort_values(by=['interval'])
df3 = pd.merge_asof(df2, df1, on='interval', by='Loc')
关于python - 日期范围匹配函数 pandas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54583709/