2

我正在处理非统一收集的时间戳索引数据,最终将按每分钟、每小时计算统计数据。我想知道按时间段聚合的最佳方法是什么。

我目前计算两个 lambda 函数,然后将两列添加到数据框中,如下所示:

h = lambda i: pd.to_datetime(i.strftime('%Y-%m-%d %H:00:00'))
m = lambda i: pd.to_datetime(i.strftime('%Y-%m-%d %H:%M:00'))
df['hours'] = df.index.map(h)
df['minutes'] = df.index.map(m)

这使我可以像这样轻松地聚合groupby

by_hour = df.groupby('hours')

我敢肯定有更好或更pythonic的方式来做到这一点,但我还没有想出来,希望有任何帮助。

4

1 回答 1

3

熊猫有几个选择。对于简单的统计,您可以在具有日期时间索引的 DataFrame/Series 上使用 resample 方法。

In [35]: ts
Out[35]: 
2012-01-01 00:00:00    127
2012-01-01 00:00:01    452
2012-01-01 00:00:02    231
2012-01-01 00:00:03    434
2012-01-01 00:00:04    139
2012-01-01 00:00:05    223
2012-01-01 00:00:06    409
2012-01-01 00:00:07    101
2012-01-01 00:00:08      3
2012-01-01 00:00:09    393
2012-01-01 00:00:10    208
2012-01-01 00:00:11    416
2012-01-01 00:00:12    136
2012-01-01 00:00:13    343
2012-01-01 00:00:14    387
...
2012-01-01 00:01:25    307
2012-01-01 00:01:26    267
2012-01-01 00:01:27    199
2012-01-01 00:01:28    479
2012-01-01 00:01:29    423
2012-01-01 00:01:30    334
2012-01-01 00:01:31    442
2012-01-01 00:01:32    282
2012-01-01 00:01:33    289
2012-01-01 00:01:34    166
2012-01-01 00:01:35      4
2012-01-01 00:01:36    306
2012-01-01 00:01:37    165
2012-01-01 00:01:38    415
2012-01-01 00:01:39    316
Freq: S, Length: 100

In [37]: ts.resample('t', how='mean')
Out[37]: 
2012-01-01 00:00:00    270.166667
2012-01-01 00:01:00    221.400000
Freq: T, dtype: float64

为了获得更大的灵活性,您可以hour按时间戳对象的(或分钟、秒等)属性进行分组:

In [38]: g = ts.groupby(lambda x: x.minute)

In [39]: g
Out[39]: <pandas.core.groupby.SeriesGroupBy object at 0x107045150>

查看有关重采样的文档:http: //pandas.pydata.org/pandas-docs/dev/timeseries.html#up-and-downsampling

于 2013-11-06T18:59:56.313 回答