使用Pandas读取CSV时如何指定时区 解决CAT时区识别警告问题
问题原因与解决方案
问题根源
tzinfos是dateutil.parser.parse方法的参数,并非pd.read_csv的官方参数,因此直接传入会触发TypeError- 警告产生的原因是
read_csv默认调用dateutil解析带时区标识的时间字符串时,无法识别CAT时区缩写,需要手动给底层解析器传入时区映射规则
最优解决方案(适配未来版本,一步完成解析)
通过自定义日期解析函数,将tzinfos参数传递给底层的dateutil解析器,直接消除警告:
import pandas as pd from dateutil.parser import parse # 定义CAT时区映射:CAT对应UTC+2,偏移量单位为秒 custom_tzinfos = {"CAT": 2 * 3600} def cat_time_parser(date_str): # 传入时区映射和dayfirst规则 return parse(date_str, tzinfos=custom_tzinfos, dayfirst=True) # 读取CSV时指定自定义解析器 df = pd.read_csv( path, parse_dates=["timestamp"], date_parser=cat_time_parser )
处理后得到的timestamp列直接是带CAT时区的时区感知类型,无需后续额外转换,也不会再触发警告。
替代方案(后续手动处理时区)
如果不需要一步解析为时区感知类型,也可以先将时间列读取为字符串,后续统一处理:
# 读取时指定timestamp列为字符串类型,避免自动解析触发警告 df = pd.read_csv(path, dtype={"timestamp": str}) # 移除末尾的CAT标识后转成datetime,再手动绑定时区 df["timestamp"] = pd.to_datetime( df["timestamp"].str.replace(r"\s*CAT$", "", regex=True), dayfirst=True ).dt.tz_localize("Africa/Johannesburg") # Africa/Johannesburg即为标准CAT时区
内容的提问来源于stack exchange,提问作者164_user
相关产品推荐
相关产品推荐

