[英]Pandas: Calculate average of values for a time frame
我正在处理一个看起来像这样的大型数据集:
Time, Value
01.01.2018 00:00:00.000, 5.1398
01.01.2018 00:01:00.000, 5.1298
01.01.2018 00:02:00.000, 5.1438
01.01.2018 00:03:00.000, 5.1228
01.01.2018 00:04:00.000, 5.1168
.... , ,,,,
31.12.2018 23:59:59.000, 6.3498
数据是一年的first
天到last
一天的minute
数据
我想用Pandas
找出每5
天的平均值。
例如:
从01.01.2018 00:00:00.000
到05.01.2018 23:59:59.000
的平均值是05.01.2018
平均值
接下来将平均从02.01.2018 00:00:00.000
,以6.01.2018 23:59:59.000
的平均水平06.01.2018
下一个平均值将是从03.01.2018 00:00:00.000
到7.01.2018 23:59:59.000
是07.01.2018
依此类推...我们将 day 递增 1,但计算从当天到过去 5 天的平均值,包括当前日期。
对于给定的一天,有 24 小时 * 60 分钟 = 1440 个数据点。 所以我需要得到 1440 个数据点 * 5 天 = 7200 个数据点的平均值。
最终的 DataFrame 将如下所示,时间格式为 [DD.MM.YYYY](不含 hh:mm:ss), Value
是包括当前日期在内的 5 个数据的平均值:
Time, Value
05.01.2018, 5.1398
06.01.2018, 5.1298
07.01.2018, 5.1438
.... , ,,,,
31.12.2018, 6.3498
底线是计算从今天到过去 5 天的数据的平均值,平均值如上所示。
我尝试遍历 Python 循环,但我想要一些比 Pandas 更好的东西。
也许这会奏效?
import numpy as np
# Create one year of random data spaced evenly in 1 minute intervals.
np.random.seed(0) # So that others can reproduce the same result given the random numbers.
time_idx = pd.date_range(start='2018-01-01', end='2018-12-31', freq='min')
df = pd.DataFrame({'Time': time_idx, 'Value': abs(np.random.randn(len(time_idx))) + 5})
>>> df.shape
(524161, 2)
给定间隔为 1 分钟的数据帧,您可以获取过去五天(5 天 * 24 小时/天 * 60 分钟/小时 = 7200 分钟)的滚动平均值,并将结果分配给名为rolling_5d_avg
的新列。 然后,您可以使用dt
访问器方法对原始时间戳进行分组以获取日期,然后获取每个日期的最后一个rolling_5d_avg
值。
df = (
df
.assign(rolling_5d_avg=df.rolling(window=5*24*60)['Value'].mean())
.groupby(df['Time'].dt.date)['rolling_5d_avg']
.last()
)
>>> df.head(10)
Time
2018-01-01 NaN
2018-01-02 NaN
2018-01-03 NaN
2018-01-04 NaN
2018-01-05 5.786603
2018-01-06 5.784011
2018-01-07 5.790133
2018-01-08 5.786967
2018-01-09 5.789944
2018-01-10 5.789299
Name: rolling_5d_avg, dtype: float64
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.