使用Pandas与Python3获取特定时间点列值及捐赠数据处理
嘿,看来你已经在Pandas的探索之路上走了一段啦!针对你提到的需求——给存储玩家统计的DataFrame新增一列,记录每周重置(周日午夜)后到对应时间点的donations最大值,我来给你一步步拆解实现方案:
因为donations是周日午夜重置、整周持续增长,所以关键是要把数据按「周日起始的周」来分组,再基于分组计算最大值。
步骤1:给每条数据打上「所属重置周」的标记
首先得给每条数据关联到它所在周的周日零点(也就是donations重置的时间),这样才能准确按重置周期分组。假设你的DataFrame有一个时间戳列(比如叫timestamp),可以这么做:
import pandas as pd # 计算每条数据对应的周日零点(重置时间) df['week_reset_time'] = df['timestamp'] - pd.to_timedelta(df['timestamp'].dt.weekday + 1, unit='D')
解释下:dt.weekday返回0(周一)到6(周日),weekday +1的数值就是当前日期距离上一个周日的天数,减去这个时间差后,week_reset_time就会精准指向该数据所在周的周日零点,也就是donations重置的起始时间。
步骤2:按重置周计算目标最大值
接下来分两种常见场景实现,看你具体需要哪种:
情况1:截至当前时间点的累积最大值
如果要的是从周日重置后,到当前这条数据的时间点为止,donations的历史最高值,用cummax()(累积最大值)就能完美实现:
df['weekly_cumulative_max'] = df.groupby('week_reset_time')['donations'].cummax()
这样每一行的weekly_cumulative_max,就是从本周日重置后到该记录时间点,donations的最高值,完全贴合你说的“整周持续增长”的场景。
情况2:当前重置周内的全局最大值
如果要的是当前这条数据所在的整周里,donations的绝对峰值(不管时间先后,只要是本周内的所有记录),用transform('max')来生成即可:
df['weekly_global_max'] = df.groupby('week_reset_time')['donations'].transform('max')
额外补充:结合你已有的每日最大值
如果你已经按年中日(dayofyear)算出了每日donations最大值(比如列名叫daily_max_donations),想再得到每周内的每日最大值累积情况,也可以套用同样的分组逻辑:
df['weekly_daily_max_cum'] = df.groupby('week_reset_time')['daily_max_donations'].cummax()
内容的提问来源于stack exchange,提问作者Alessio Colizza

