Pandas时区转换异常:股票数据过滤后起始时间不符求助
问题定位
你遇到的过滤异常是因为错误使用datetime.replace()附加pytz时区导致的:
- 直接给无时区信息的naive datetime用
replace(tzinfo=pytz时区),会生成带有旧时区偏移(比如你看到的LMT-1 day, 19:04:00)的datetime对象,而非纽约夏令时(EDT,偏移-04:00)的正确时间。 - API返回的
t字段是带正确EDT时区的时间(格式如2024-08-28 09:30:00-04:00),两者时区偏移不一致,导致时间比较逻辑失效,错误过滤掉了开盘时段的数据。
解决方案
使用pytz时区对象的localize()方法为naive datetime添加正确时区信息,该方法会自动处理夏令时(DST)的偏移转换。
修改后的代码
import pytz from datetime import datetime, timedelta start_datetime = datetime.strptime(start_date, '%Y-%m-%d') end_datetime = datetime.strptime(end_date, '%Y-%m-%d') + timedelta(days=1) current_date = start_datetime ny_tz = pytz.timezone('America/New_York') # 提前定义纽约时区 while current_date < end_datetime: date_str = current_date.strftime('%Y-%m-%d') # 使用localize替代replace,正确附加时区 market_open_naive = current_date.replace(hour=9, minute=30, second=0, microsecond=0) market_open = ny_tz.localize(market_open_naive, is_dst=None) # is_dst=None强制检测夏令时 market_close_naive = current_date.replace(hour=16, minute=0, second=0, microsecond=0) market_close = ny_tz.localize(market_close_naive, is_dst=None) for ticker in tickers: ticker_minute_data = await fetch_minute_data(session, ticker, date_str) if not ticker_minute_data.empty: ticker_minute_data = ticker_minute_data[(ticker_minute_data['t'] >= market_open) & (ticker_minute_data['t'] <= market_close)]
额外建议(可选)
如果使用Python 3.9及以上版本,推荐用标准库的zoneinfo模块替代pytz,语法更简洁且无需额外安装:
from zoneinfo import ZoneInfo ny_tz = ZoneInfo('America/New_York') # 直接构造带时区的datetime,无需localize market_open = datetime(current_date.year, current_date.month, current_date.day, 9, 30, tzinfo=ny_tz) market_close = datetime(current_date.year, current_date.month, current_date.day, 16, 0, tzinfo=ny_tz)
内容的提问来源于stack exchange,提问作者Alexandru Lupa
相关产品推荐
相关产品推荐

