python - 日期范围匹配函数 pandas

标签 python pandas datetime for-loop date-range

我有一个名为 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 中的每个 StartEnd 周期,该函数检查 >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 日期重叠。关于如何纠正这个问题有什么建议吗?谢谢您

最佳答案

更简单的解决方案是使用 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/

相关文章:

python - Elink函数返回HTTP 414问题

python - 如何拆分混合值列?

c# - 从当前日期提前日期时间(持续时间)

php - mysql时间和php时间不一样

python - mycursor.executemany UPDATE 未按预期工作

python - 从 python 列表中删除邮政编码(以从 MapQuest 输出获取州名称)

python - matplotlib 中的 twiny() 改变 y 轴刻度

python - 将数据帧值拆分为指定数量的组并应用函数 - pandas

python - 使用 Python 对 DataFrame 中的 header 进行排序

c# - 如何解析时间值 "400"(相当于4 :00) using DateTime. TryParseExact