
pandas的expanding()函数提供了一种灵活的方式来执行扩展窗口计算。它从序列的第一个元素开始,逐步包含后续元素,并在每个点上应用指定的聚合函数(如mean()、sum()、min()等)。例如,data["somecolumn"].expanding().mean() 会计算到当前点为止的所有数据的累积平均值。
然而,在处理时间序列数据时,我们经常会遇到一个特定的需求:希望expanding()计算在每天开始时“重置”。这意味着,对于新的一天,计算应该从该天的第一条记录开始,将其视为独立的序列,而不是继续前一天的累积。直接应用expanding()函数无法满足这一要求,因为它会跨越日界限持续累积。
要解决上述问题,核心思路是先将数据按日期进行分组,然后在每个日期组内部独立地应用expanding()函数。这样可以确保每个新的一天都有一个全新的累积计算起点。
首先,确保你的时间序列数据帧的索引是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)为了按天进行分组,我们需要从DatetimeIndex中提取出不包含时间部分的日期字符串。这可以通过dt.strftime("%Y-%m-%d")方法实现,并将其作为一个新的列添加到数据帧中。
# 从索引中提取日期并创建新的'day'列作为分组键
df["day"] = df.index.to_series().dt.strftime("%Y-%m-%d")
print("\n添加'day'列后的数据帧:")
print(df)有了“day”列作为分组键,我们现在可以使用groupby()方法。在分组之后,我们可以对每个组应用expanding()函数,然后调用所需的聚合方法(例如mean())。
# 按'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,完美地实现了按日重置的需求。
# 对所有数值列进行按日重置的expanding().mean()
# daily_expanding_all_cols = df.groupby("day").expanding().mean()通过结合Pandas的groupby()和expanding()函数,我们可以优雅地解决时间序列数据中按日重置累积计算的复杂问题。关键在于创建合适的日期分组键,并在此基础上应用扩展窗口操作。这种方法不仅功能强大,而且代码简洁易懂,是处理时间序列数据时不可或缺的技巧。掌握这一技术,将使你在进行时间序列分析时更加灵活和高效。
以上就是Pandas时间序列:按日分组重置expanding()计算的实用指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号