在熊猫中平均每分钟

Posted

技术标签:

【中文标题】在熊猫中平均每分钟【英文标题】:Getting average per minute in pandas 【发布时间】:2019-02-09 19:55:08 【问题描述】:

关于我要问的问题,已经有很多关于堆栈溢出的问题,但我有一点疑问,因此我认为我的问题有所不同。在我的时间序列中,我想获得每分钟的平均值。我的时间序列如下所示:-

      time                         duration
2018-08-26T14:00:00.000Z           0.22
2018-08-26T14:00:00.000Z           0.23
2018-08-26T14:00:00.000Z           2.05
2018-08-26T14:00:00.000Z           2.5
2018-08-26T14:00:00.000Z           3.0
2018-08-26T14:00:01.000Z           30.4 
2018-08-26T14:00:01.000Z           30.4 
2018-08-26T14:00:01.000Z           30.4 
2018-08-26T14:00:02.000Z           30.4 
2018-08-26T14:00:02.000Z           30.4 
2018-08-26T14:00:03.000Z           30.4 
.....
2018-08-26T14:01:03.000Z           30.4 
2018-08-26T14:01:03.000Z           30.4 
2018-08-26T14:02:03.000Z           30.4 
2018-08-26T14:02:03.000Z           30.4 

由于数据来自弹性搜索,我在同一秒内进行了多次观察。从 Multiple 我的意思是我可能有 100 次观察,从一秒钟的时间戳

我正在使用下面的代码来执行我从Group index by minute and compute average 获得的平均每分钟持续时间

df.index = pd.DatetimeIndex(df.time)

df.groupby([df.index.values.astype('<M8[m]')])['duration'].mean()

我的输出如下所示

2018-08-26 14:00:00    0.151470
2018-08-26 14:01:00    0.144745
2018-08-26 14:02:00    0.147503
2018-08-26 14:03:00    0.156921
2018-08-26 14:04:00    0.142978
2018-08-26 14:05:00    0.167170
2018-08-26 14:06:00    0.156233
2018-08-26 14:07:00    0.140044
2018-08-26 14:08:00    0.135376
2018-08-26 14:09:00    0.161247
2018-08-26 14:10:00    0.134211
2018-08-26 14:11:00    0.179065
2018-08-26 14:12:00    0.145470
2018-08-26 14:13:00    0.145623
2018-08-26 14:14:00    0.139927
2018-08-26 14:15:00    0.138283
2018-08-26 14:16:00    0.137545
2018-08-26 14:17:00    0.140346

我只是想确保我这样做是否正确,因为我在一秒钟内有多个实例,我担心它是否正在考虑所有这些。

我将不胜感激。

【问题讨论】:

您是否尝试过手动过滤掉一分钟的数据并验证您对该子集的手动结果是否与您从该代码中获得的结果相同? @scnerd 我做了,不幸的是它不同:( 有趣.....我从来没有处理过这种数据,但正如你已经告诉你的那样,它已经过验证并且工作不正确。 重复的秒是否代表重复数据?或者没有足够时间精度的附加数据。只有你能提供这个答案。 【参考方案1】:

这就是.resample() 的用途:

resample() 是一个基于时间的 groupby,然后是对其每个组的归约方法。

可验证的例子:

>>> import pandas as pd
>>> import numpy as np
>>> np.random.seed(444)

>>> # millisecond frequency, 100000 periods starting 2017-01-01 00:00:00
>>> idx = pd.date_range(start='2017', periods=100000, freq='ms')
>>> idx.min(), idx.max()
(Timestamp('2017-01-01 00:00:00', freq='L'), Timestamp('2017-01-01 00:01:39.999000', freq='L'))

>>> s = pd.Series(np.random.randn(len(idx)), index=idx)
>>> s.resample('s').mean().head()
2017-01-01 00:00:00    0.009352
2017-01-01 00:00:01    0.061978
2017-01-01 00:00:02   -0.011118
2017-01-01 00:00:03    0.046698
2017-01-01 00:00:04   -0.008205

人工检查应该匹配:

>>> s.loc['2017-01-01 00:00:00'].mean()
0.00935201762323959
>>> s.loc['2017-01-01 00:00:01'].mean()
0.061978455181838

【讨论】:

因为我的答案中的数据有负值@ak3191。如果有什么不清楚的地方,我可以在这个答案中添加一些 cmets

以上是关于在熊猫中平均每分钟的主要内容,如果未能解决你的问题,请参考以下文章

平均每五分钟数据作为熊猫数据框中的一个数据点

熊猫在数据框列表中获得每(行,列)的平均值

如何计算熊猫每列的每日平均值?

时间序列重采样错误 - 熊猫列中没有日期索引

熊猫数据框每一行的加权平均值

具有时间偏移熊猫的滚动平均值