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

DDD
发布: 2025-10-07 14:24:04
原创
590人浏览过

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())。

绘蛙
绘蛙

电商场景的AI创作平台,无需高薪聘请商拍和文案团队,使用绘蛙即可低成本、批量创作优质的商拍图、种草文案

绘蛙 179
查看详情 绘蛙
# 按'day'列分组,然后在每个组内应用expanding().mean()
daily_expanding_mean = df.groupby("day")["B"].expanding().mean()

print("\n按日重置的expanding().mean()结果:")
print(daily_expanding_mean)
登录后复制

输出结果解析:

                                        B
day                                     
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.333333
2023-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()计算的实用指南的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号