我有一个几年来每小时的数据框架,格式如下:
Date/Time Value
01.03.2010 00:00:00 60
01.03.2010 01:00:00 50
01.03.2010 02:00:00 52
01.03.2010 03:00:00 49
.
.
.
31.12.2013 23:00:00 77
我想对数据求平均值,这样我就可以得到第0小时,第1小时…每年的第23小时
那么输出应该是这样的:
Year Hour Avg
2010 00 63
2010 01 55
2010 02 50
.
.
.
2013 22 71
2013 23 80
有人知道如何在熊猫中获得这个吗?
注意:既然Series有了dt访问器,那么date作为索引就不那么重要了,尽管date/Time仍然需要是datetime64
更新:您可以更直接地执行groupby(不使用lambda):
In [21]: df.groupby([df["Date/Time"].dt.year, df["Date/Time"].dt.hour]).mean()
Out[21]:
Value
Date/Time Date/Time
2010 0 60
1 50
2 52
3 49
In [22]: res = df.groupby([df["Date/Time"].dt.year, df["Date/Time"].dt.hour]).mean()
In [23]: res.index.names = ["year", "hour"]
In [24]: res
Out[24]:
Value
year hour
2010 0 60
1 50
2 52
3 49
如果是datetime64 索引你可以这样做:
In [31]: df1.groupby([df1.index.year, df1.index.hour]).mean()
Out[31]:
Value
2010 0 60
1 50
2 52
3 49
旧答案(会比较慢):
假设Date/Time是索引*,您可以在groupby中使用映射函数:
In [11]: year_hour_means = df1.groupby(lambda x: (x.year, x.hour)).mean()
In [12]: year_hour_means
Out[12]:
Value
(2010, 0) 60
(2010, 1) 50
(2010, 2) 52
(2010, 3) 49
对于更有用的索引,您可以从元组创建MultiIndex:
In [13]: year_hour_means.index = pd.MultiIndex.from_tuples(year_hour_means.index,
names=['year', 'hour'])
In [14]: year_hour_means
Out[14]:
Value
year hour
2010 0 60
1 50
2 52
3 49
*如果没有,则先使用set_index
:
df1 = df.set_index('Date/Time')
如果您的日期/时间列是datetime格式(请参阅dateutil。解析器(自动解析选项),您可以像下面这样使用pandas样本:
year_hour_means = df.resample('H',how = 'mean')
将数据保存为日期时间格式。