Python 在几天内按日期合并2个数据帧?

Python 在几天内按日期合并2个数据帧?,python,pandas,date,merge,Python,Pandas,Date,Merge,我用在线数据创建和清理了这两个熊猫数据框,我试图根据它们的日期合并它们,这些日期都是按月计算的。但是,无论第二个数据集是否基于当月的第一天,第一个数据集的日期都是当月的最后一天 # 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

我用在线数据创建和清理了这两个熊猫数据框,我试图根据它们的日期合并它们,这些日期都是按月计算的。但是,无论第二个数据集是否基于当月的第一天,第一个数据集的日期都是当月的最后一天

# 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')
但在这种情况下,它们永远不会匹配,即使它们都是相似的日期


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

如果您的日期列被称为
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'])

IIUC,你想在最近的日期合并吗?这就是我们的目的

如果日期尚未转换为datetime,请按此方式进行转换

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

您可以只在第二个数据框中添加一天,因为一个月的最后一天总是跟在一个月的第一天之后。但是,10月有31天,因此2009-10-30不是一个月的最后一天。^这是一个很好的观点。如果这只是一个错误输入,那么我建议使用datetime模块编辑和排序日期,并查看strTime:您可以在月份中加1或减1(取决于您想去的方向),然后将日期放在日期内。这个问题有帮助吗?在你的问题上给一个答案。在您的例子中,两个示例数据帧没有重叠。还有,预期的结果是什么?我很高兴看到有一个量身定做的解决方案。然而,当我尝试此操作时,我得到一个“左键必须排序”错误,尽管我确保两个数据集只有两列,并且它们的日期列命名相同,并且已经转换为datetime。对,在使用此技术(即
data1.sort_值('date',升序=True))合并列之前,只需对列进行排序即可
我正在使用此方法对它们进行排序,但是没有任何内容得到排序,尽管没有向我抛出错误。我刚才碰巧自己猜到了那个额外的参数,现在数据排序了。谢谢!而我选择了DJK的答案bec。他展示了一个强大的功能,专门用于处理此类情况,您的解决方案也展示了一种有效且重要的方法来处理此问题。谢谢!没问题,我也会选择他的答案!我不知道
merge\u asof