Python 熊猫:计算时间范围内的平均值

Python 熊猫:计算时间范围内的平均值,python,python-3.x,pandas,Python,Python 3.x,Pandas,我正在处理的大型数据集如下所示: 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 数据是从一年中的

我正在处理的大型数据集如下所示:

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
数据是从一年中的第一天到最后一天的
分钟
数据

我想使用
Pandas
查找每
5
天的平均值

例如:

2018年1月1日00:00:00.000
2018年1月5日23:59:59.000
的平均值是
2018年1月5日

下一个平均值将从
2018年01月02日00:00:00.000
2018年01月6日23:59:59.000
2018年01月06日

下一个平均值将从
2018年01月03日00:00:00.000
2018年01月7日23:59:59.000
2018年01月07日

等等。。。我们每天递增1,但计算从当天到过去5天(包括当前日期)的平均值

对于给定的一天,有24小时*60分钟=1440个数据点。所以我需要得到1440个数据点的平均值*5天=7200个数据点

最后的数据帧如下所示,时间格式为[DD.MM.YYYY](不含hh:MM:ss),
值是包括当前日期在内的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\u 5d\u avg
的新列。然后,您可以使用
dt
accessor方法对原始时间戳进行分组以获取日期,然后为每个日期获取最后一个
rolling\u 5d\u 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

@Valentino的可能副本解决方案不起作用,因为我想要的最终解决方案是不同的。重复的
replicate
答案会为接下来的
15s
计算一次,但我想要的是为接下来的5天每天计算一次。“我们没有像问题中所说的那样跳过一天。@亚历山大-问得好。前4个数据将为NAN,因为没有要进行平均的数字,因为我们正在进行5个数字的平均。对不起,您是对的,这不是您为此导入的
NumPy
np.random.seed(0)
?请你再详细说明一下措辞好吗。非常感谢。嗯<代码>df['Value'].head(5*24*60).mean().round(6)
结果为
5.786603
,与1月5日的第一个数字匹配。您指的是哪个平均值?在您的数据中,还是在我上面创建的示例数据中?如果是前者,请检查以确保没有丢失数据点(
df['Time'].diff().max()
应导致
Timedelta('0天00:01:00')
)。如果是后者,请将种子重置为0并复制上面的代码,以确保获得相同的结果。此解决方案应该完全按照您刚才在上面的注释中所述的方式执行。让我们来看看。