Pandas时间序列:按日分组重置expanding()计算的实用指南

Pandas时间序列:按日分组重置expanding()计算的实用指南

在Pandas时间序列分析中,当需要对数据进行累积计算(如expanding().mean())时,若要求每个新的一天开始时重新启动计算,则常规方法不再适用。本教程将详细介绍如何利用groupby()结合日期信息,高效地实现按日分组的累积计算,确保每日统计的独立性和准确性,从而解决时间序列数据中按天重置expanding()操作的挑战。

理解 expanding() 函数及其在时间序列中的挑战

pandas的expanding()函数提供了一种灵活的方式来执行扩展窗口计算。它从序列的第一个元素开始,逐步包含后续元素,并在每个点上应用指定的聚合函数(如mean()、sum()、min()等)。例如,data[“somecolumn”].expanding().mean() 会计算到当前点为止的所有数据的累积平均值。

然而,在处理时间序列数据时,我们经常会遇到一个特定的需求:希望expanding()计算在每天开始时“重置”。这意味着,对于新的一天,计算应该从该天的第一条记录开始,将其视为独立的序列,而不是继续前一天的累积。直接应用expanding()函数无法满足这一要求,因为它会跨越日界限持续累积。

实现按日分组的累积计算

要解决上述问题,核心思路是先将数据按日期进行分组,然后在每个日期组内部独立地应用expanding()函数。这样可以确保每个新的一天都有一个全新的累积计算起点。

1. 数据准备

首先,确保你的时间序列数据帧的索引是DatetimeIndex类型,因为这将方便我们提取日期信息。如果索引不是DatetimeIndex,你需要使用pd.to_datetime()将其转换。

import pandas as pd# 示例数据df = pd.DataFrame(    {"B": [1, 2, 4, 0, 4]},    index=pd.to_datetime(        ["2023-12-11 21:00:00", "2023-12-11 22:00:00", "2023-12-11 23:00:00",         "2023-12-12 00:00:00", "2023-12-12 01:00:00"]    ))print("原始数据帧:")print(df)

2. 提取日期信息并创建分组键

为了按天进行分组,我们需要从DatetimeIndex中提取出不包含时间部分的日期字符串。这可以通过dt.strftime(“%Y-%m-%d”)方法实现,并将其作为一个新的列添加到数据帧中。

# 从索引中提取日期并创建新的'day'列作为分组键df["day"] = df.index.to_series().dt.strftime("%Y-%m-%d")print("n添加'day'列后的数据帧:")print(df)

3. 分组并应用 expanding()

有了“day”列作为分组键,我们现在可以使用groupby()方法。在分组之后,我们可以对每个组应用expanding()函数,然后调用所需的聚合方法(例如mean())。

# 按'day'列分组,然后在每个组内应用expanding().mean()daily_expanding_mean = df.groupby("day")["B"].expanding().mean()print("n按日重置的expanding().mean()结果:")print(daily_expanding_mean)

输出结果解析:

                                        Bday                                     2023-12-11 2023-12-11 21:00:00  1.000000           2023-12-11 22:00:00  1.500000           2023-12-11 23:00:00  2.3333332023-12-12 2023-12-12 00:00:00  0.000000           2023-12-12 01:00:00  2.000000

从结果中可以看出,对于2023-12-11这一天,expanding().mean()计算了(1)、(1+2)/2、(1+2+4)/3。而当日期切换到2023-12-12时,计算重新开始,首先是(0),然后是(0+4)/2,完美地实现了按日重置的需求。

注意事项

索引排序: 虽然Pandas的groupby()通常能够正确处理未排序的索引,但为了确保expanding()在每个组内按时间顺序正确计算,建议在操作前确保DatetimeIndex是按升序排列的。如果数据可能无序,可以先使用df = df.sort_index()。数据类型: 确保时间序列索引确实是DatetimeIndex类型。如果不是,dt访问器将无法使用。其他聚合函数: expanding()不仅限于mean()。你可以根据需求使用sum()、min()、max()、std()、count()等其他聚合函数。例如,df.groupby(“day”)[“B”].expanding().sum()将计算每日的累积和。多列操作: 如果需要对多列进行相同的按日重置expanding()计算,可以直接在groupby().expanding()之后选择多列,或省略列选择器来对所有数值列进行操作。

# 对所有数值列进行按日重置的expanding().mean()# daily_expanding_all_cols = df.groupby("day").expanding().mean()

性能考量: 对于非常大的数据集,创建额外的“day”列会增加内存开销。在某些情况下,也可以考虑使用df.index.day、df.index.month等直接从索引中提取数字日期部分进行分组,但这会稍微改变分组键的表示形式。对于日常使用,字符串格式的日期通常更直观。

总结

通过结合Pandas的groupby()和expanding()函数,我们可以优雅地解决时间序列数据中按日重置累积计算的复杂问题。关键在于创建合适的日期分组键,并在此基础上应用扩展窗口操作。这种方法不仅功能强大,而且代码简洁易懂,是处理时间序列数据时不可或缺的技巧。掌握这一技术,将使你在进行时间序列分析时更加灵活和高效。

以上就是Pandas时间序列:按日分组重置expanding()计算的实用指南的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1376224.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 15:43:26
下一篇 2025年12月14日 15:43:39

相关推荐

发表回复

登录后才能评论
关注微信