Pandas:计算时间段内值的平均数

3

我正在处理一个类似于这样的大型数据集:

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 天的平均值。

例如:

01.01.2018 00:00:00.00005.01.2018 23:59:59.000 的平均值是 05.01.2018

下一个平均值将从 02.01.2018 00:00:00.0006.01.2018 23:59:59.000,平均值为 06.01.2018

接下来,平均值将从 03.01.2018 00:00:00.0007.01.2018 23:59:59.000,平均值为07.01.2018

依此类推...... 我们按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更好的方法。


可能是特定时间段内的平均值的重复问题。 - Valentino
@Valentino,这个解决方案不可行,因为我最终想要的解决方案是不同的。duplicate答案计算每隔15s,但我想要的是在接下来的5天内每天计算一次。我们并没有像问题中所述的那样跳过一天。 - floss
@Alexander - 很好的问题。前4个数据将是NAN,因为没有数字可以取平均值,因为我们正在进行5个数字的平均值。 - floss
对不起,你是正确的,这不是那个重复的。 - Valentino
1个回答

3
也许这会起作用?
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

你是否在这个程序中导入了NumPy,以及 np.random.seed(0)?能否请您提供一些额外的详细信息来澄清一下。谢谢! - floss
1
嗯... df['Value'].head(5 * 24 * 60).mean().round(6) 的结果是 5.786603,与1月5日的第一个数字相匹配。你指的是哪个平均值? - Alexander
1
在您的数据中,还是在我上面创建的示例数据中?如果是前者,请检查以确保您没有丢失数据点(df['Time'].diff().max() 应该得出 Timedelta('0 days 00:01:00'))。如果是后者,请将种子重置为 0 并复制上面的代码以确保您获得相同的结果。 - Alexander
1
这个解决方案应该恰好做到你在上面的评论中描述的内容。 - Alexander
1
让我们在聊天中继续这个讨论 - Alexander
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接