Python中基于分钟维度的Pandas滚动求和实现(非GroupBy方式)
使用rolling方法实现分钟维度的累计求和
看了你的需求,想要不用groupby,纯靠rolling方法来计算每个分钟内X列的累计和对吧?我给你整理了一个可行的方案,一步步来:
首先,先把你的示例数据转换成可运行的DataFrame:
import pandas as pd # 构造示例数据 data = { 'dateTime': ['2017-09-19 02:00:04']*5 + ['2017-09-19 02:00:22']*2, '1min': ['2017-09-19 02:00:00']*7, 'hour': [2]*7, 'minute': [0]*7, 'X': [93, 1, 1, 0, 0, 1, 1], 'EXPECTED Rolling_X': [93, 94, 95, 95, 95, 96, 97] } df = pd.DataFrame(data) # 转换为时间类型 df['dateTime'] = pd.to_datetime(df['dateTime']) df['1min'] = pd.to_datetime(df['1min']) # 确保数据按时间排序(这一步很重要,保证同分钟的行连续) df = df.sort_values('dateTime').reset_index(drop=True)
接下来是核心的rolling实现步骤:
# 标记每一行是否是新一分钟的起始行 df['new_minute'] = df['1min'].ne(df['1min'].shift()).astype(int) # 使用rolling窗口计算同分钟内的累计和 df['Rolling_X'] = df.rolling(window=len(df), min_periods=1).apply( lambda win: win[win['new_minute'].cumsum() == win['new_minute'].cumsum().iloc[-1]]['X'].sum(), raw=False ) # 验证结果 print(df[['X', 'EXPECTED Rolling_X', 'Rolling_X']])
代码解释:
- 排序与标记新分钟:首先确保数据按时间排序,这样同一分钟的记录是连续的。然后用
new_minute列标记当前行是否属于新的一分钟(和上一行的分钟时间不同则标记为1)。 - rolling窗口计算:我们用一个覆盖从第一行到当前行的滚动窗口,在
apply函数里,通过new_minute的累计和来筛选出当前分钟内的所有行,然后对这些行的X值求和,就得到了你要的分钟维度累计和。
运行后你会看到Rolling_X列和你预期的EXPECTED Rolling_X完全一致。
内容的提问来源于stack exchange,提问作者Giladbi
相关产品推荐
相关产品推荐

