【问题标题】:Date Range Matching Function pandas日期范围匹配函数 pandas
【发布时间】:2019-07-02 04:22:04
【问题描述】:

我有一个名为 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 中属于该日期范围的行是否与位置匹配,即执行@987654331 @的比赛。在它们不匹配的地方,我希望将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】:

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

【讨论】:

  • 谢谢,我从来不知道你可以合并最近的键!现在我可以在我的flag 列中添加一个 1,只要有 nan 就可以了。
猜你喜欢
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 2018-02-20
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多