在pandas数据框中获取多年平均工作日某小时的均值

17

我有一个跨越多年的按小时计算的数据框,格式如下:

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

有人知道如何在pandas中获得这个吗?

2个回答

23

注意:现在Series有了dt访问器,日期是否为索引不那么重要,但Date/Time仍然需要是datetime64类型。

更新:你可以更直接地进行分组(无需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

旧回答(速度较慢):

假设日期/时间是索引*,您可以在 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')

非常感谢。我之前一直试着使用循环,但这种方法更好。 - Markus W
请问有人知道如何将“x.year”或“x.hour”作为动态参数填充到“df1.groupby(lambda x: (x.year, x.hour)).mean()”的lambda函数中吗?定义Variable1=x.year和Variable2=x.hour,然后在“df1.groupby(lambda x: (Variable1, Variable2)).mean()”中使用似乎不起作用。 - Markus W
@MarkusW 你应该提出一个新问题 :) ...听起来你想使用一个正式的函数(不是lambda)。 - Andy Hayden
@AndyHayden 你真是个天才。请问一下:lambda函数是否总是默认使用索引?那么,对于一个多级索引,这是否默认为该多级索引的元组? - Little Bobby Tables
1
@josh 是的,不过你可以传递 as_index=False 来覆盖它。重新阅读这个问题后,我会做一些不同的事情。更新了一个更好的方法来完成这个任务(它恰好可以直接创建多级索引)。 - Andy Hayden
如果我有一个跨越多天的DatetimeIndex,以10分钟间隔的方式,我该如何按10分钟分组? - chaikov

2
如果您的日期/时间列是datetime格式(请参阅dateutil.parser以获取自动解析选项),则可以使用以下方式使用pandas resample:
year_hour_means = df.resample('H',how = 'mean')

这将使您的数据保留在日期时间格式中。这可能有助于您在之后对数据进行任何操作时更加方便。


这并不是从一天到另一天的平均值。 - endolith
尝试使用以下代码:daily_average = df.resample('D').mean(),其中df具有datetimeindex。 - enmyj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接