Python基于datetime列计算前序日期价格百分比涨幅实现
报错原因
你遇到的InvalidIndexError和计算逻辑偏差来自三个问题:
- 直接对全表做shift操作没有按币种分组,会把A币种的价格错位匹配到B币种的行上
- 将
datetime设为索引后,同一日期对应多个币种的多条记录,索引值重复,不满足concat对齐要求的索引唯一性条件 - 代码中引用了未定义的
df_btc变量,和前期处理的df对象不匹配
正确实现代码
先按币种分组做时间序列位移,从根源避免跨币种数据错配和重复索引问题:
import pandas as pd # 统一日期格式,过滤异常时间值 df['datetime'] = pd.to_datetime(df['datetime']).dt.date # 按币种、日期升序排序,保证时间序列顺序正确 df = df.sort_values(by=['slug', 'datetime']).reset_index(drop=True) # 按币种分组,分别取前1日、前2日的对应价格 df['price_1d_ago'] = df.groupby('slug')['price_usd'].shift(periods=1) df['price_2d_ago'] = df.groupby('slug')['price_usd'].shift(periods=2) # 计算对应周期的涨幅百分比 df['%increase_24'] = (df['price_usd'] / df['price_1d_ago'] - 1) * 100 df['%increase_48'] = (df['price_usd'] / df['price_2d_ago'] - 1) * 100 # 可选操作:删除临时生成的历史价格列,仅保留需要的输出字段 # df = df.drop(columns=['price_1d_ago', 'price_2d_ago'])
避坑提示
- shift时不要加
freq='D'参数:该参数会直接修改索引日期值做硬对齐,不会顺着现有数据的行做位移,遇到缺失日期的情况会直接匹配出空值,分组位移行是适配多币种面板数据的最稳妥方案 - 如果原始数据存在同一币种同一天多条价格记录,先按天做聚合(比如取当日收盘价、均价)再走上述流程,否则会出现位移错位
- 每个币种最开始的1-2条记录没有对应历史价格,计算出的涨幅值为空属于正常情况,无需额外处理
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

