Python中如何计算dataframe周初与周末数据差值并统计周度结果
实现步骤(基于Pandas)
首先确保你的DataFrame满足两个基础条件:
- 存在 datetime 类型的日期字段(示例中命名为
date) - 存在需要统计的持仓字段(示例中命名为
position)
步骤1:预处理排序与周标识生成
先按日期升序排序保证时间顺序正确,同时生成年+周的唯一标识,避免跨年周统计错误:
import pandas as pd # 按日期升序排序 df = df.sort_values('date').reset_index(drop=True) # 生成年_周唯一标识 df['year_week'] = df['date'].dt.isocalendar().year.astype(str) + '_' + df['date'].dt.isocalendar().week.astype(str)
步骤2:按需计算对应差值
你给出的示例包含两类差值计算,可按需选择:
1. 同周周终持仓 - 同周周初持仓
和你示例中「同周周终2/周初2差值为0、同周周初12/周终15差值为3」的逻辑完全匹配:
week_stat = df.groupby('year_week')['position'].agg( week_start = 'first', # 取周内第一条记录为周初持仓 week_end = 'last' # 取周内最后一条记录为周终持仓 ).reset_index() week_stat['same_week_diff'] = week_stat['week_end'] - week_stat['week_start'] # 如果你的需求是周初减周终,改为 week_stat['same_week_diff'] = week_stat['week_start'] - week_stat['week_end'] 即可
2. 本周周初持仓 - 上周周初持仓
和你示例中「上周周初4、本周周初7差值为3」的逻辑完全匹配:
# 基于上面生成的周度统计结果直接差分即可 week_stat['week_on_week_diff'] = week_stat['week_start'].diff()
特殊情况适配
如果你的原始数据存在单日多条记录的情况,需要先按天聚合取每日的最终持仓,再执行上面的周度统计:
# 按天聚合,取每日最后一条记录的持仓作为当日终持仓 df_daily = df.sort_values('date').groupby(df['date'].dt.date)['position'].last().reset_index() # 转回datetime类型供后续周度统计使用 df_daily['date'] = pd.to_datetime(df_daily['date'])
内容的提问来源于stack exchange,提问作者Hau Harry
相关产品推荐
相关产品推荐

