
本文介绍如何将 csv 文件中标准格式的日期时间字符串(如 "2020-04-10 04:00:00")准确转换为回测所需的毫秒级 unix 时间戳(如 1586481600000),并适配 pandas 数据处理流程。
本文介绍如何将 csv 文件中标准格式的日期时间字符串(如 "2020-04-10 04:00:00")准确转换为回测所需的毫秒级 unix 时间戳(如 1586481600000),并适配 pandas 数据处理流程。
在量化回测场景中,许多框架(如 Backtrader、VectorBT)要求时间索引为数值型 Unix 时间戳(单位:毫秒),而原始行情 CSV 文件通常以可读字符串形式存储时间,例如 "2020-04-10 04:00:00"。直接使用 datetime.fromtimestamp() 反向解析会导致逻辑错误——该函数适用于已知时间戳转 datetime,而非字符串转时间戳。
正确做法分两步:先用 strptime 解析字符串为 datetime 对象,再通过 .timestamp() 获取秒级时间戳,最后乘以 1000 转为毫秒。关键在于时区处理:若原始数据为 UTC 时间(常见于交易所 K 线),需显式设置 tzinfo=timezone.utc,否则 timestamp() 默认按本地时区计算,将导致数小时偏差。
以下为完整可复用的转换示例:
from datetime import datetime, timezone import pandas as pd # 示例:单条时间字符串转换 dt_str = "2020-04-10 04:00:00" dt_obj = datetime.strptime(dt_str, "%Y-%m-%d %H:%M:%S") ts_ms = int(dt_obj.replace(tzinfo=timezone.utc).timestamp() * 1000) print(ts_ms) # 输出:1586481600000
应用到您的 getEthereumData 函数中,需修改 CSV 读取逻辑——不再依赖现有 "Timestamp" 列(可能不存在),而是解析 "DateTime" 字符串列:
def getEthereumData(start_date, end_date):
print("Start reading ethereum data..")
path = os.path.dirname(os.path.abspath(__file__))
data = pd.read_csv(path + "\data\BTCUSDT-1m-data.csv")
# ✅ 正确步骤:解析字符串时间列 → 转为带UTC时区的datetime → 设为索引
data['DateTime'] = pd.to_datetime(data['DateTime'], format="%Y-%m-%d %H:%M:%S", utc=True)
data = data.set_index('DateTime')
# ✅ 可选:添加毫秒级时间戳列供后续使用
data['Timestamp_ms'] = (data.index.astype('int64') // 10**6).astype('int64') # 精确转毫秒
data = data.dropna()
data = data[parse(start_date): parse(end_date)]
print("Reading complete")
return data⚠️ 注意事项:
- 若 CSV 中时间字段名为 "time" 或 "date",请替换 data['DateTime'] 为对应列名;
- pd.to_datetime(..., utc=True) 比手动 strptime 更高效,且自动处理批量数据;
- 避免使用 datetime.fromtimestamp(ts/1000) 处理字符串——这是反向操作,仅适用于已有时间戳;
- 回测前务必验证首尾时间戳是否符合预期(可用 data.index[0].timestamp() * 1000 手动校验)。
掌握这一转换逻辑后,您即可无缝对接任意含标准时间字符串的行情数据源,确保时间索引精度与回测引擎严格一致。

















