使用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
相关产品推荐
相关产品推荐

