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

Posted

技术标签:

【中文标题】Pandas - 如何在不同格式的日期时间列上合并数据框?【英文标题】:Pandas - how to merge dataframes on datetime column of different format? 【发布时间】:2019-12-13 23:38:14 【问题描述】:

我有两个需要根据日期合并的数据框。第一个数据框如下所示:

             Time Stamp  HP_1H_mean  Coolant1_1H_mean  Extreme_1H_mean
0   2019-07-26 07:00:00  410.637966        414.607081              0.0   
1   2019-07-26 08:00:00  403.521735        424.787366              0.0   
2   2019-07-26 09:00:00  403.143925        425.739639              0.0   
3   2019-07-26 10:00:00  410.542895        426.210538              0.0
...
17  2019-07-27 00:00:00    0.000000          0.000000              0.0   
18  2019-07-27 01:00:00    0.000000          0.000000              0.0   
19  2019-07-27 02:00:00    0.000000          0.000000              0.0   
20  2019-07-27 03:00:00    0.000000          0.000000              0.0 

第二个是这样的:

    Time Stamp  Qty Compl
0   2019-07-26  150
1   2019-07-27  20
2   2019-07-29  230
3   2019-07-30  230
4   2019-07-31  170

Time Stamp 两个列都是 datetime64[ns]。我想向左合并,并将日期向前填充到所有其他行中。我的问题是在合并时,来自第二个 df 的 Qty Compl 在每天的午夜应用,有些日子没有午夜时间戳,例如第一个数据帧中的第一天。

有没有办法合并和匹配包含同一天的每一行?所需的输出如下所示:

         Time Stamp  HP_1H_mean  Coolant1_1H_mean  Extreme_1H_mean    Qty Compl
0   2019-07-26 07:00:00  410.637966        414.607081              0.0      150   
1   2019-07-26 08:00:00  403.521735        424.787366              0.0      150
2   2019-07-26 09:00:00  403.143925        425.739639              0.0      150
3   2019-07-26 10:00:00  410.542895        426.210538              0.0      150
...
17  2019-07-27 00:00:00    0.000000          0.000000              0.0      20
18  2019-07-27 01:00:00    0.000000          0.000000              0.0      20
19  2019-07-27 02:00:00    0.000000          0.000000              0.0      20
20  2019-07-27 03:00:00    0.000000          0.000000              0.0      20

【问题讨论】:

【参考方案1】:

使用 merge_asof 并按日期时间对两个 DataFrame 进行排序:

#if necessary
df1['Time Stamp'] = pd.to_datetime(df1['Time Stamp'])
df2['Time Stamp'] = pd.to_datetime(df2['Time Stamp'])
df1 = df1.sort_values('Time Stamp')
df2 = df2.sort_values('Time Stamp')

df = pd.merge_asof(df1, df2, on='Time Stamp')
print (df)
           Time Stamp  HP_1H_mean  Coolant1_1H_mean  Extreme_1H_mean  \
0 2019-07-26 07:00:00  410.637966        414.607081              0.0   
1 2019-07-26 08:00:00  403.521735        424.787366              0.0   
2 2019-07-26 09:00:00  403.143925        425.739639              0.0   
3 2019-07-26 10:00:00  410.542895        426.210538              0.0   
4 2019-07-27 00:00:00    0.000000          0.000000              0.0   
5 2019-07-27 01:00:00    0.000000          0.000000              0.0   
6 2019-07-27 02:00:00    0.000000          0.000000              0.0   
7 2019-07-27 03:00:00    0.000000          0.000000              0.0   

   Qty Compl  
0        150  
1        150  
2        150  
3        150  
4         20  
5         20  
6         20  
7         20  

【讨论】:

太棒了,我从未使用过merge_asof。它默认为左合并总是它看起来像?谢谢你的帮助,太完美了。时间到了会接受……你太快了;) @55thSwiss - 是的,这类似于左连接,只是我们匹配最近的键而不是相等的键

以上是关于Pandas - 如何在不同格式的日期时间列上合并数据框?的主要内容,如果未能解决你的问题,请参考以下文章

合并两个 Pandas 数据帧,在一个时间列上重新采样,插值

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

在数值最近的索引、完全外连接、聚合列上合并 Pandas 时间序列数据集到最大值

如何在日期时间索引和两列上合并熊猫数据框

Pandas 在日期列上重新采样

Pandas:如何通过保留第一个数据框的信息来合并列上的两个数据框?