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

使用tz_convert将UNIX时间戳转换为US/Central时区的问题排查

问题:UNIX时间戳转US/Central时区异常排查

我尝试将UNIX时间戳转换为US/Central时区的时间,但误以为始终得到UTC格式输出,不清楚代码中存在什么问题。以下是我的代码及运行结果:

import ccxt
import pandas as pd
from dateutil import tz

binance = ccxt.binance({
    'enableRateLimit': True,
    'apiKey': 'xxxxxxxxxxxxxxxxxxx',
    'secret': 'xxxxxxxxxxxxx'
    })

symbol = 'ETHUSDT'
timeframe = '15m'
limit = 500

bars = binance.fetch_ohlcv (symbol, timeframe = timeframe, limit = limit)
df = pd.DataFrame(bars, columns = ['timestamp','open','high','low', 'close', 'volume'])
df['timestamp'] = pd.to_datetime(df['timestamp'], unit = 'ms').dt.tz_localize(tz='US/Central')
df['timestamp'] = pd.to_datetime(df['timestamp'], unit = 'ms').dt.tz_convert(tz='US/Central')
print(df)

运行结果:

timestamp     open     high      low    close      volume
0   2022-11-21 12:15:00-06:00  1120.63  1122.74  1118.26  1119.31   3278.5060
1   2022-11-21 12:30:00-06:00  1119.30  1127.48  1115.10  1125.31  11065.4442
2   2022-11-21 12:45:00-06:00  1125.32  1128.36  1123.92  1127.30   5447.6054
3   2022-11-21 13:00:00-06:00  1127.30  1136.75  1125.67  1133.81  15977.1500
4   2022-11-21 13:15:00-06:00  1133.82  1146.99  1132.77  1139.39  21009.7356
..                        ...      ...      ...      ...      ...         ...
495 2022-11-26 16:00:00-06:00  1210.90  1212.87  1208.77  1212.54   3822.1327
496 2022-11-26 16:15:00-06:00  1212.55  1213.92  1212.09  1213.63   2414.2695
497 2022-11-26 16:30:00-06:00  1213.62  1213.63  1211.05  1212.89   2461.4644
498 2022-11-26 16:45:00-06:00  1212.89  1212.94  1209.00  1209.76   2544.8965
499 2022-11-26 17:00:00-06:00  1209.75  1210.00  1207.74  1209.77   1638.1446

问题分析与修复

首先明确:你的输出其实已经是US/Central时区了(末尾的-06:00是该时区非夏令时的偏移量,代表UTC-6),你可能误解了格式显示。但代码里存在两处错误/冗余:

  • 第一行时间处理:pd.to_datetime(..., unit='ms').dt.tz_localize(tz='US/Central')
    Binance返回的时间戳是UTC时区的毫秒级UNIX时间,这里直接将其本地化到US/Central,相当于把UTC时间错误当成了中部时区的本地时间,逻辑完全颠倒。
  • 第二行时间处理:重复调用pd.to_datetime且传入unit='ms',此时df['timestamp']已经是带时区的datetime对象,不是数值型时间戳,这行代码不仅冗余,还会引发隐性错误。

正确代码实现

import ccxt
import pandas as pd
from dateutil import tz

binance = ccxt.binance({
    'enableRateLimit': True,
    'apiKey': 'xxxxxxxxxxxxxxxxxxx',
    'secret': 'xxxxxxxxxxxxx'
})

symbol = 'ETHUSDT'
timeframe = '15m'
limit = 500

bars = binance.fetch_ohlcv(symbol, timeframe=timeframe, limit=limit)
df = pd.DataFrame(bars, columns=['timestamp','open','high','low', 'close', 'volume'])

# 正确流程:先将时间戳转为UTC时区的datetime,再转换到US/Central
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms', utc=True).dt.tz_convert(tz='US/Central')

print(df)

补充说明

  • pd.to_datetime(..., utc=True)会直接将毫秒时间戳解析为UTC时区的datetime对象,这是符合Binance数据规范的正确操作。
  • dt.tz_convert(tz='US/Central')负责将UTC时间转换为目标时区,转换后输出的-06:00(或夏令时的-05:00)是时区偏移的标准显示格式,代表时间已经正确转换。

内容的提问来源于stack exchange,提问作者python_rok

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:10:12