Python 在一个数据帧中获取几年内工作日某个小时的平均值

Python 在一个数据帧中获取几年内工作日某个小时的平均值,python,datetime,pandas,average,statistics,Python,Datetime,Pandas,Average,Statistics,我有一个每小时一次的数据帧,在几年中采用以下格式: 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 A

我有一个每小时一次的数据帧,在几年中采用以下格式:

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中获取此信息吗?

注意:既然系列具有dt访问器,那么日期作为索引就不那么重要了,尽管日期/时间仍然需要是datetime64

更新:您可以更直接地执行groupby(无需lambda):

如果是datetime64索引,您可以执行以下操作:

In [31]: df1.groupby([df1.index.year, df1.index.hour]).mean()
Out[31]:
        Value
2010 0     60
     1     50
     2     52
     3     49

旧答案(将较慢):

假设日期/时间是索引*,则可以在中使用映射函数:

对于更有用的索引,可以从元组创建多索引:

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
*如果没有,则首先使用:


如果日期/时间列采用datetime格式(有关自动解析选项,请参见dateutil.parser),则可以使用pandas重采样,如下所示:

year_hour_means = df.resample('H',how = 'mean')

它将以日期时间格式保存数据。这可能有助于您对数据进行后续处理。

非常感谢。我一直在尝试使用循环,但这是一种更好的方法。注意:有人知道如何将“df1.groupby(lambda x:(x.year,x.hour)).mean()的“x.year”或“x.hour”作为动态参数填充到lamda函数中吗?为“df1.groupby(lambda x:(Variable1,Variable2)).mean()”定义Varialbe1=x.year和Variable2=x.hour似乎不起作用。@MarkusW您应该作为一个新问题来问:)。。。听起来你想使用一个合适的函数(即不是lambda)@而且你是个天才。你能澄清一下吗:lambda函数总是默认使用索引吗?然后给定一个多索引,这默认为该多索引的一个元组?@josh yes,不过您可以将
传递为\u index=False
来覆盖它。在重读这个问题时,我会做一些不同的事情。更新了一个更好的方法来实现这一点(碰巧直接创建了多索引)。这不是一天到下一天的平均值though@endolith尝试daily_average=df.resample('D').mean(),其中df有datetimeindex
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
df1 = df.set_index('Date/Time')
year_hour_means = df.resample('H',how = 'mean')