如何使用包含1970年之前日期的非标准格式将Pandas系列字符串转换为Pandas日期时间



我有一列日期,格式如下:

Jan-85
Apr-99
Nov-01
Feb-65
Apr-57
Dec-19

我想将其转换为pandas日期时间对象。

以下语法可用于转换它们:

pd.to_datetime(temp, format='%b-%y')

其中temp是日期的pd.Series对象。当然,这里最突出的问题是,1970年之前的日期被错误地转换为20xx。

我尝试用以下参数更新函数调用:

pd.to_datetime(temp, format='%b-%y', origin='1950-01-01')

然而,我得到了错误:

Name: temp, Length: 42537, dtype: object' is not compatible with origin='1950-01-01'; it must be numeric with a unit specified

我试着按照它所说的指定一个单位,但我遇到了另一个错误,因为不能在格式旁边指定单位。

有什么办法解决这个问题吗?

只是@DudeWah的逻辑,但对代码进行了改进:

def days_of_future_past(date,chk_y=pd.Timestamp.today().year):
return date.replace(year=date.year-100) if date.year > chk_y else date

temp = pd.to_datetime(temp,format='%b-%y').map(days_of_future_past)

输出:

>>> temp
0   1985-01-01
1   1999-04-01
2   2001-11-01
3   1965-02-01
4   1957-04-01
5   2019-12-01
6   1965-05-01
Name: date, dtype: datetime64[ns]

继续回答我自己的问题,这样其他人在遇到同样的问题时就可以使用这个解决方案。不是最棒的,但它能完成任务。它应该能工作到2069年,所以希望熊猫届时能有更好的解决方案

也许其他人会发布更好的解决方案。

def wrong_date_preprocess(data):
"""Correct date issues with pre-1970 dates with whacky mon-yy format."""
df1 = data.copy()
dates = df1['date_column_of_interest']
# use particular datetime format with data; ex: jan-91
dates = pd.to_datetime(dates, format='%b-%y')
# look at wrongly defined python dates (pre 1970) and get indices
date_dummy = dates[dates > pd.Timestamp.today().floor('D')]
idx = list(date_dummy.index)
# fix wrong dates by offsetting 100 years back dates that defaulted to > 2069
dummy2 = date_dummy.apply(lambda x: x.replace(year=x.year - 100)).to_list()
dates.loc[idx] = dummy2
df1['date_column_of_interest'] = dates
return(df1)

最新更新