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两位数只能去00到99这将是不明确的,如果我们开始穿越百年.
如果没有重叠,您可以手动处理它并注释世纪(消除歧义)
我建议您手动处理数据并指定世纪,例如,您可以确定数据中年份介于17和68之间的任何内容都归因于1917 - 1968年(而不是2017年 - 2068年).
如果您有重叠,那么您无法处理年份信息不足,除非您有一些有序数据和参考
如果你有重叠,例如你有2016年和1916年的数据,并且两者都被记录为'16',这是不明确的,没有足够的信息来解析这个,除非数据是按日期排序的,在这种情况下你可以使用启发式在解析它时切换世纪.
对于正在寻找快速且肮脏的代码段来修复这些情况的任何人,这对我来说都是有效的:
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)
您可能需要根据数据中最早的日期将阈值日期调整为更接近当前日期。
| 归档时间: |
|
| 查看次数: |
5532 次 |
| 最近记录: |