基于相同小时合并Pandas Dataframes

时间:2018-04-12 17:21:13

标签: python pandas

我有一个以小时为间隔的值历史记录,我想在数据框中添加一列,将每小时的平均值放在每天。因此,如果4:00的平均值为34,我希望每小时4:00的每个日期在名为' Average'的列中有34个。现在我可以用一小时的时间表来获得平均值,但似乎不能让它加入多个地点。

Timestamp              Value
2018-04-12 13:00:00     12.0
2018-04-12 12:00:00     38.0
2018-04-12 11:00:00     12.0
2018-04-12 10:00:00     28.0
2018-04-12 09:00:00     26.0
2018-04-12 08:00:00     22.0
...

       Average
00:00   7.0
01:00   0.0
02:00   0.0
03:00   0.0
04:00   0.0
05:00   1.5
06:00   11.5
07:00   11.0
08:00   10.5
...

目标:

Timestamp              Value    Average
2018-04-12 13:00:00     12.0      8.5
2018-04-12 12:00:00     38.0      8.4
2018-04-12 11:00:00     12.0     15.5
2018-04-12 10:00:00     28.0     19.0
2018-04-12 09:00:00     26.0     12.4
2018-04-12 08:00:00     22.0     10.5

我尝试过合并和加入,但还没有想出如何通过手动循环来完成它。

1 个答案:

答案 0 :(得分:3)

如果您使用pd.to_datetime()将它们转换为日期时间,那么这个非常简单那么您可以在.dt.hour上合并。

import pandas as pd
df1 = pd.DataFrame({'Timestamp': ['2018-04-12 13:00:00','2018-04-12 12:00:00',
    '2018-04-12 11:00:00','2018-04-12 10:00:00','2018-04-12 09:00:00','2018-04-12 08:00:00'],
    'Value': [12, 38, 12, 28, 26, 22]})
df2 = pd.DataFrame({'Hour': ['00:00','01:00','02:00','03:00','04:00',
                            '05:00','06:00','07:00', '08:00'],
                   'Average': [7, 0,0,0,0,1.5, 11.5, 11, 10.5]})

df1['Timestamp'] = pd.to_datetime(df1.Timestamp)
df2['Hour'] = pd.to_datetime(df2.Hour)

现在好了,它将小时数转换为datetime对象,将今天作为当前日期,但由于我们只是按小时合并它并不重要。

df1.merge(df2, left_on=df1.Timestamp.dt.hour, right_on=df2.Hour.dt.hour, how='left').drop(columns='Hour')
#            Timestamp  Value  Average
#0 2018-04-12 13:00:00     12      NaN
#1 2018-04-12 12:00:00     38      NaN
#2 2018-04-12 11:00:00     12      NaN
#3 2018-04-12 10:00:00     28      NaN
#4 2018-04-12 09:00:00     26      NaN
#5 2018-04-12 08:00:00     22     10.5

只有很多非合并,因为您提供的样本数据在每组中只有08:00重叠。

或不转换:

mt = pd.to_datetime(df1.Timestamp).dt.hour
mh = pd.to_datetime(df2.Hour).dt.hour

df1.merge(df2, left_on=mt, right_on=mh, how='left').drop(columns=['Hour'])