首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >日期范围匹配函数pandas

日期范围匹配函数pandas
EN

Stack Overflow用户
提问于 2019-02-08 07:06:47
回答 1查看 684关注 0票数 1

我有一个名为df1的数据帧,它看起来像这样:

代码语言:javascript
运行
复制
  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的数据帧,它看起来像这样:

代码语言:javascript
运行
复制
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。以下是我尝试的代码:

代码语言:javascript
运行
复制
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日期重叠的原因。关于如何纠正这个问题,有什么建议吗?谢谢

EN

Stack Overflow用户

回答已采纳

发布于 2019-02-08 08:06:59

更简单的解决方案是使用merge_asof。这类似于左连接,除了我们匹配最近的键而不是相等的键。这里有更多:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.merge_asof.html

代码语言:javascript
运行
复制
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')
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54583709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档