生成含空时间间隔的5分钟频率日累计销售时间序列及问题排查
解决pd.Grouper分组缺失时间间隔及多维度分组为空的问题
一、单表(datetime+gmv)补全0-5分钟间隔并计算每日累计
原数据缺失0-5分钟间隔是因为该时间段无交易,分组时不会自动生成空区间,需要先构造完整时间序列再合并:
- 提取所有唯一日期,生成每个日期的完整5分钟时间序列
import pandas as pd # 假设原数据为df,datetime列已转为datetime类型 df['date'] = df['datetime'].dt.date all_dates = df['date'].unique() full_time_index = [] for date in all_dates: start = pd.Timestamp(date) end = start + pd.Timedelta(days=1) - pd.Timedelta(minutes=5) # 生成当日00:00到23:55的5分钟间隔序列 time_range = pd.date_range(start=start, end=end, freq='5Min', origin='start_day') full_time_index.extend(time_range) full_time_index = pd.DatetimeIndex(full_time_index) - 分组求和后合并到完整序列,计算每日累计
# 按5分钟间隔分组计算单区间销售额 grouped = df.groupby(pd.Grouper(key='datetime', freq='5Min', origin='start_day'))['gmv'].sum() # 对齐完整时间序列,缺失值补0 full_gmv = grouped.reindex(full_time_index, fill_value=0) # 按日期计算累计销售额 full_gmv = full_gmv.groupby(full_gmv.index.date).cumsum()
二、带marca字段的多维度分组处理(避免结果为空)
结果为空是因为仅保留了有交易的marca+时间间隔组合,需为每个marca的每个日期生成完整时间序列:
- 生成每个marca+日期的完整时间序列
# 获取所有唯一的marca和日期组合 marca_date_pairs = df[['marca', 'date']].drop_duplicates().values.tolist() full_multi_index = [] for marca, date in marca_date_pairs: start = pd.Timestamp(date) end = start + pd.Timedelta(days=1) - pd.Timedelta(minutes=5) time_range = pd.date_range(start=start, end=end, freq='5Min', origin='start_day') for dt in time_range: full_multi_index.append((marca, dt)) # 转为多级索引 full_multi_index = pd.MultiIndex.from_tuples(full_multi_index, names=['marca', 'datetime']) - 分组求和后合并到完整多级索引
# 按marca+5分钟间隔分组计算销售额 grouped_marca = df.groupby(['marca', pd.Grouper(key='datetime', freq='5Min', origin='start_day')])['gmv'].sum() # 对齐完整多级索引,缺失值补0 full_marca_gmv = grouped_marca.reindex(full_multi_index, fill_value=0) # 按marca和日期计算累计销售额 full_marca_gmv = full_marca_gmv.groupby(['marca', full_marca_gmv.index.get_level_values('datetime').date]).cumsum()
内容的提问来源于stack exchange,提问作者FábioRB
相关产品推荐
相关产品推荐

