pandas to_datetime解析错误的一年

dan*_*n_g 9 python datetime pandas

我遇到的事情几乎肯定是我自己的一个愚蠢的错误,但我似乎无法弄清楚发生了什么.

基本上,我有一系列日期作为格式的字符串"%d-%b-%y",例如26-Sep-05.当我将它们转换为日期时,这一年有时是正确的,但有时它不是.

例如:

dates = ['26-Sep-05', '26-Sep-05', '15-Jun-70', '5-Dec-94', '9-Jan-61', '8-Feb-55']

pd.to_datetime(dates, format="%d-%b-%y")
DatetimeIndex(['2005-09-26', '2005-09-26', '1970-06-15', '1994-12-05',
               '2061-01-09', '2055-02-08'],
              dtype='datetime64[ns]', freq=None)
Run Code Online (Sandbox Code Playgroud)

最后两个条目,这些年份以2061年和2055年的形式返回,是错误的.但这适用于15-Jun-70入口.这里发生了什么?

bak*_*kal 11

这似乎是Python库日期时间的行为,我做了一个测试,看看截止点是68 - 69:

datetime.datetime.strptime('31-Dec-68', '%d-%b-%y').date()
>>> datetime.date(2068, 12, 31)

datetime.datetime.strptime('1-Jan-69', '%d-%b-%y').date()
>>> datetime.date(1969, 1, 1)
Run Code Online (Sandbox Code Playgroud)

两位数年份歧义

所以看起来%y年低于69的任何东西都将归因于2000年的一个世纪,而69岁以上的东西将被归结为1900年

%y两位数只能去0099这将是不明确的,如果我们开始穿越百年.

如果没有重叠,您可以手动处理它并注释世纪(消除歧义)

我建议您手动处理数据并指定世纪,例如,您可以确定数据中年份介于17和68之间的任何内容都归因于1917 - 1968年(而不是2017年 - 2068年).

如果您有重叠,那么您无法处理年份信息不足,除非您有一些有序数据和参考

如果你有重叠,例如你有2016年和1916年的数据,并且两者都被记录为'16',这是不明确的,没有足够的信息来解析这个,除非数据是按日期排序的,在这种情况下你可以使用启发式在解析它时切换世纪.


Max*_*axU 10

文档

2000 年 (Y2K) 问题: Python 依赖于平台的 C 库,该库通常没有 2000 年问题,因为所有日期和时间都在内部表示为自纪元以来的秒数。当给定 %y 格式代码时,函数 strptime() 可以解析 2 位数的年份。解析 2 位数年份时,它们会根据 POSIX 和 ISO C 标准进行转换:值69–99映射到1969–1999,值 0–68映射到2000–2068


Coq*_*cot 7

对于正在寻找快速且肮脏的代码段来修复这些情况的任何人,这对我来说都是有效的:

from datetime import timedelta, date
col = 'date'
df[col] = pd.to_datetime(df[col])
future = df[col] > date(year=2050,month=1,day=1)
df.loc[future, col] -= timedelta(days=365.25*100)
Run Code Online (Sandbox Code Playgroud)

您可能需要根据数据中最早的日期将阈值日期调整为更接近当前日期。