我有一个大型数据集:
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
数据是minute
数据,从每年的first
到每年的last
我想使用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
的{{1}}到6.01.2018 23:59:59.000
下一个平均值将从06.01.2018
的{{1}}到03.01.2018 00:00:00.000
以此类推...
在给定的一天中,有24小时* 60分钟= 1440个数据点。因此,我需要获取1440个数据点的平均值* 5天= 7200个数据点。
最终的DataFrame如下所示:
7.01.2018 23:59:59.000
最重要的是计算从今天到过去5天的平均值,平均值如上所示。
我尝试遍历Python循环,但是我想要比Pandas更好的东西。
答案 0 :(得分:1)
您要进行滚动平均,然后每天重新采样。
df = pd.DataFrame(dict(
Time=pd.date_range('2018-01-01', '2018-01-7 23:59', freq='12H')
)).assign(Value=lambda d: np.arange(len(d)))
df['Time'] = pd.to_datetime(df['Time'])
df = df.set_index('Time')
df
Value
Time
2018-01-01 00:00:00 0
2018-01-01 12:00:00 1
2018-01-02 00:00:00 2
2018-01-02 12:00:00 3
2018-01-03 00:00:00 4
2018-01-03 12:00:00 5
2018-01-04 00:00:00 6
2018-01-04 12:00:00 7
2018-01-05 00:00:00 8
2018-01-05 12:00:00 9
2018-01-06 00:00:00 10
2018-01-06 12:00:00 11
2018-01-07 00:00:00 12
2018-01-07 12:00:00 13
按时间窗口滚动时有趣的是,熊猫不知道您何时开始一个完整的滚动周期。因此,df.rolling('5D').mean()
将立即开始计算均值。您可以通过每天重新采样后减少前5天(或4天)的时间来解决此问题。
df.rolling('5D').mean().resample('D').last().iloc[4:]
Value
Time
2018-01-05 4.5
2018-01-06 6.5
2018-01-07 8.5
答案 1 :(得分:1)
正如您所说的那样,您有每分钟的数据,即每天总是有相同数量的值(1440),那么您可以简单地采用每日平均值,然后取5这些日常手段的每日滚动窗口。
示例(值是一年中的运行分钟数,从0开始):
s = pd.Series(pd.date_range('2018-01-01', '2018-12-31 23:59', freq='1T'))
df = pd.DataFrame(s.index.values, index=s, columns=['Value'])
df.groupby(df.index.floor('d'))['Value'].mean().rolling(5).mean().dropna()
结果:
2018-01-05 3599.5
2018-01-06 5039.5
2018-01-07 6479.5
2018-01-08 7919.5
...
2018-12-28 517679.5
2018-12-29 519119.5
2018-12-30 520559.5
2018-12-31 521999.5