多种日期格式,朝着一种适当的格式

Multiple date formats, towards one proper format

我有一个包含多个日期的日期列:

Date
2022-01-01 00:00:00
jan 20
january 19

如何以可扩展的方式(无需字典)将它们转换为正确的日期时间格式?

我试过了:

df['Date_1'] = pd.to_datetime(df['Date'], errors='coerce').astype(str)

df['Date_2'] = pd.to_datetime(df['Date'], errors='coerce', ,yearfirst = False, format = '%B %y')).astype(str)

df['Date1'] = df['Date1'].str.replace('NaT','')
df['Date2'] = df['Date2'].str.replace('NaT','')

然后,我将两列合并为:

df['Date3'] = df['Date1'] + df['Date2']

但是,这不起作用,因为我需要创建另一种格式(用于非缩写月份)。 但是当添加上面的逻辑,然后将 %B 更改为 %b 时,它会重复一些月份(比如 may,它既是缩写又是完整的月份)。

我想得到最终结果:

2022-01-01
2020-01-01
2019-01-01

没有直接的方法可以同时处理所有格式。

你能做的就是使用连续的方法。在这里,我使用正则表达式组合了“1 月 19 日”和“1 月 20 日”。如果您将来发现更多格式,您可以使用其他 .fillna(<new_converter>)

(pd
 .to_datetime(df['Date'], errors='coerce')
 .fillna(pd.to_datetime(df['Date'].str.replace('([a-z]{3})[a-z]+', r'', regex=True),
                        errors='coerce', yearfirst=False, format='%b %y')
        )
)

输出:

0   2022-01-01
1   2020-01-01
2   2019-01-01
Name: Date, dtype: datetime64[ns]

使用combine_first尝试各种不同的日期格式:

date = pd.to_datetime(df["Date"], errors="coerce")

for format in ["%b %y", "%B %y"]:
    date = date.combine_first(pd.to_datetime(df["Date"], format=format, errors="coerce"))

df["Date"] = date