日期范围匹配功能大熊猫

问题描述 投票:1回答:1

我有一个数据帧称为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

我想建立使得对于每一个StartEnddf1,功能检查是否在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的在实际位置相匹配。我认为这是因为重叠StartEnd日期。我如何能去纠正这个任何提示?谢谢

python pandas datetime for-loop date-range
1个回答
0
投票

更简单的解决方案是使用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')
© www.soinside.com 2019 - 2024. All rights reserved.