在几天内按日期合并 2 个 Pandas 数据框?

Posted

技术标签:

【中文标题】在几天内按日期合并 2 个 Pandas 数据框?【英文标题】:Merge 2 Pandas dataframes by dates within a few days of each other? 【发布时间】:2018-08-11 05:17:31 【问题描述】:

我有这两个从在线数据中创建和清理的 pandas 数据框,我试图根据它们的日期合并它们,这些日期都是按月计算的。但是,第一个数据集的日期是该月的最后一天,而第二个数据集是否基于该月的第一天。

# data1
0    1987-01-01  63.752
1    1987-02-01  64.152
2    1987-03-01  64.488
3    1987-04-01  64.995

# data2
0   1987-01-31  1115.10
1   1987-02-30  1095.63
2   1987-03-30  1036.19
3   1987-04-30  1057.08

如果我有缺少几天的日常数据,我通常会通过这样的方式合并它们

data3 = pd.merge(left=data1, left_on='Date', right=data2, right_on='Date')

但在这种情况下,它们永远不会匹配,即使它们都是相似的日期。

我将如何“告诉”Pandas 根据仅相隔几天的日期组合数据集,并仅按“月 - 年”命名每个数据?我不知道从哪里开始。

【问题讨论】:

您可以只在第二个数据框中添加一天,因为一个月的最后一天总是跟着一个月的第一天。但是,10 月有 31 天,因此 2009-10-30 不是该月的最后一天。 ^这是一个很好的观点。如果这只是输入错误,那么我建议使用 datetime 模块编辑和排序日期并查看 strptime:docs.python.org/2/library/datetime.html 然后您可以在月份中加 1 或减 1(取决于您想要的方向)和然后将日期放在日期内。 这个问题有帮助吗? ***.com/q/21201618/3639023 在您的问题中提供Minimal, Complete, Verifiable Example。在您的情况下,两个示例 DataFrame 没有重叠。还有预期的结果是什么? 【参考方案1】:

IIUC,您想在最近的日期合并吗?这就是merge_asof 的用途

如果日期尚未转换为日期时间,请像这样转换它们

data1.date = pd.to_datetime(data1.date)
data2.date = pd.to_datetime(data2.date)

现在完成合并

pd.merge_asof(data1,data2,on='date',direction='nearest')

       date  value_x  value_y
0 1987-01-01   63.752  1115.10
1 1987-02-01   64.152  1036.19
2 1987-03-01   64.488  1057.08
3 1987-04-01   64.995  1057.08

【讨论】:

我很高兴看到似乎有一个量身定制的解决方案。然而,当我尝试这个时,我得到一个“左键必须排序”的错误,即使我确保两个数据集只有两列并且它们的日期列被命名为相同并且已经转换为日期时间。 对,您只需要在使用此技术合并列之前对列进行排序,即data1.sort_values('date',ascending=True) 我正在使用这种方法对它们进行排序,但没有得到任何排序,尽管没有向我抛出任何错误。 刚才我碰巧猜到了那个额外的参数,现在数据排序了。非常感谢!【参考方案2】:

如果您的日期列名为date,您可以按照以下方式进行操作:

data1['date'] = pd.to_datetime(data1['date'])
data2['date'] = pd.to_datetime(data2['date'])

data1['month'] = data1['date'].dt.month
data1['year'] = data1['date'].dt.year

data2['month'] = data2['date'].dt.month
data2['year'] = data2['date'].dt.year

这会导致这样的事情:

>>> data1
        date   value  month  year
0                                
0 1987-01-01  63.752      1  1987
1 1987-02-01  64.152      2  1987
2 1987-03-01  64.488      3  1987
3 1987-04-01  64.995      4  1987
>>> data2
        date    value  month  year
0                                 
0 1987-01-01  1115.10      1  1987
1 1987-01-02  1095.63      1  1987
2 1987-02-01  1036.19      2  1987
3 1987-02-28  1057.08      2  1987

然后您可以按月份和年份合并它们:

data3=data1.merge(data2, on=['month', 'year'])

【讨论】:

虽然我选择了 DJK 的回答 bec。他展示了专门用于处理此类情况的强大功能,您的解决方案还展示了解决此问题的有效且重要的方法。非常感谢! 没问题,我也会选择他的答案!我不知道merge_asof

以上是关于在几天内按日期合并 2 个 Pandas 数据框?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在几天内获得pandas抵消别名的持续时间?

在 pandas 中,是不是有一些紧凑的方法可以在一周中的几天内绘制数据?

pandas - 合并日期列不起作用

Pandas - 如何在不同格式的日期时间列上合并数据框?

如何将数据框中的多列合并为 Pandas 日期时间格式

Pandas加入(合并?)数据帧,只保留唯一的指标