如何筛选含时区信息的datetime列中指定时间的所有行?
问题原因与解决方案
你的问题出在直接用datetime构造器给tzinfo传pytz时区对象的方式上。US/Eastern是包含夏令时规则的时区,datetime构造器的tzinfo参数无法正确处理pytz时区的夏令时逻辑,导致你生成的query_dt和DataFrame中存储的dt列对象,虽然表面时间显示一致,但内部的时区元数据或偏移规则不匹配,最终==判断无法命中。
解决方法一:用pytz的localize方法构造正确时区时间
先构造无时区的naive datetime,再通过pytz的localize方法绑定时区,这个方法会严格处理夏令时规则:
import pytz import datetime eastern = pytz.timezone('US/Eastern') # 先创建不带时区的时间对象 query_dt_naive = datetime.datetime(2023, 1, 1, 12, 0) # 用localize绑定时区,is_dst=None会强制检查时间是否合法(避免夏令时过渡问题) query_dt = eastern.localize(query_dt_naive, is_dst=None) df_sub = df[df.dt == query_dt]
解决方法二:用pandas直接构造带时区的时间(更简便)
利用pandas的to_datetime方法直接生成匹配DataFrame时区格式的datetime对象,无需手动处理pytz的细节:
import pandas as pd # 直接构造带US/Eastern时区的时间 query_dt = pd.to_datetime('2023-01-01 12:00:00').tz_localize('US/Eastern') df_sub = df[df.dt == query_dt]
额外验证技巧
如果还是不确定,可以打印两者的tzinfo属性和timestamp()值,看是否完全一致:
print(df.dt.iloc[0].tzinfo) print(query_dt.tzinfo) print(df.dt.iloc[0].timestamp()) print(query_dt.timestamp())
只要timestamp值相同,就说明是同一个时间点,此时用==判断应该能匹配成功。
内容的提问来源于stack exchange,提问作者24n8
相关产品推荐
相关产品推荐

