You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 22:36:23