我尝试使用pandas读取CSV文件,并得到一个我不理解的警告:
Libsite-packagesdateutilparser_parser.py:1207: UnknownTimezoneWarning: tzname B identified but not understood. Pass `tzinfos` argument in order to correctly return a timezone-aware datetime. In a future version, this will raise an exception.
warnings.warn("tzname {tzname} identified but not understood. "
我没有做什么特别的,只是pd.read_csv
和parse_dates=True
。我在我的数据中没有看到任何看起来像时区的B
。这个警告是什么意思?
一个最小可复制的例子如下:
import io
import pandas as pd
pd.read_csv(io.StringIO('xn1A2B'), index_col=0, parse_dates=True)
为什么熊猫认为1A2B
是一个日期时间?
为了解决这个问题,我尝试添加dtype={'x': str}
来强制列变成字符串。但我一直得到警告,不管…
结果显示1A2B
被解释为"当前月的第2天上午1点,时区"。默认情况下,read_csv使用dateutil
检测日期时间值(date_parser=
):
import dateutil.parser
dateutil.parser.parse('1A2B')
除了警告,这返回(今天):
datetime.datetime(2023, 1, 2, 1, 0)
和B确实不是一个有效的时区说明符。
为什么添加dtype
没有帮助还有待研究。
我找到了一个简单的方法:
import dateutil.parser
def dateparse(self, timestr, default=None, ignoretz=False, tzinfos=None, **kwargs):
return self._parse(timestr, **kwargs)
dateutil.parser.parser.parse = dateparse # Monkey patch; hack!
这可以防止使用当前的日期/月/年作为默认值,将值呈现为无效的datetime
。