我有一个以小时为间隔的值历史记录,我想在数据框中添加一列,将每小时的平均值放在每天。因此,如果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
我尝试过合并和加入,但还没有想出如何通过手动循环来完成它。
答案 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'])