多种日期格式,朝着一种适当的格式
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
我有一个包含多个日期的日期列:
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