要转换为日期格式的多格式字符串列
Multi-format string column to be converted into date format
我有一列代表日期,但格式为字符串。我不能使用简单的 pandas.to_datetime,例如:
01/02/2023
Apr 02, 2016
Jun 2021
2023/12/01
我试图创建一个下面的公式,我将在其中列出可能的日期格式并使用 for 循环将列转换为所需的格式。但是,这显然是错误的,因为在应用它之后该列包含 NONE。你能告诉我更好的方向或者我应该改变什么吗?
def DateFormat(data):
for fmt in ('%b %d, %Y', '%d/%m/%Y', '%b %Y', '%Y/%b/%d'):
try:
pd.to_datetime(data['date'], format=fmt)
except ValueError:
pass
data['date'] = data.apply(DateFormat, axis = 1)
应用日期格式之前:
|编号 |日期 |
| --- | -------------- |
| 1 | 2023 年 1 月 2 日 |
| 2 | 2016 年 4 月 2 日 |
| 3 | 2021 年 6 月 |
| 4 | 2023/12/01 |
应用日期格式后:
|编号 |日期 |
| --- | ----- |
| 1 | None |
| 2 | None |
| 3 | None |
| 4 | None |
如果您不使用 return
到 return 值,那么它将在函数末尾使用 return None
。
你应该使用return pd.to_datetime(...)
如果你想 return 无法转换的原始值,那么最后需要 return
。或者你可以使用 return
到 return 一些默认值。
def DateFormat(data):
for fmt in ('%b %d, %Y', '%d/%m/%Y', '%b %Y', '%Y/%b/%d'):
try:
return pd.to_datetime(data['date'], format=fmt)
except ValueError:
pass
# return original `date` if it couldn't convert
return data['date']
# or return some default value
#return datetime.datetime(1900, 1, 1)
编辑:
最少的工作代码。
我还添加了来自@Corralien 答案的代码,它也适用于此数据。
import pandas as pd
# --- functions ---
def parse_date(row):
# I had to add `'%Y/%m/%d'`
for fmt in ('%b %d, %Y', '%d/%m/%Y', '%b %Y', '%Y/%b/%d', '%Y/%m/%d'):
try:
return pd.to_datetime(row['date'], format=fmt)
except ValueError:
pass
# --- main ---
data = pd.DataFrame({
'date': ['01/02/2023', 'Apr 02, 2016', 'Jun 2021', '2023/12/01']
})
data['new_date_1'] = data.apply(parse_date, axis=1)
data['new_date_2'] = pd.to_datetime(data['date'], dayfirst=True)
print(data)
结果:
date new_date_1 new_date_2
0 01/02/2023 2023-02-01 2023-02-01
1 Apr 02, 2016 2016-04-02 2016-04-02
2 Jun 2021 2021-06-01 2021-06-01
3 2023/12/01 2023-12-01 2023-12-01
为什么不让 Pandas 推断您的日期时间格式?并强制 dayfirst=True
作为你的第一个日期格式 (%d/%m/%Y
)
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)
print(df)
# Output
ID Date
0 1 2023-02-01
1 2 2016-04-02
2 3 2021-06-01
3 4 2023-12-01
我有一列代表日期,但格式为字符串。我不能使用简单的 pandas.to_datetime,例如:
01/02/2023
Apr 02, 2016
Jun 2021
2023/12/01
我试图创建一个下面的公式,我将在其中列出可能的日期格式并使用 for 循环将列转换为所需的格式。但是,这显然是错误的,因为在应用它之后该列包含 NONE。你能告诉我更好的方向或者我应该改变什么吗?
def DateFormat(data):
for fmt in ('%b %d, %Y', '%d/%m/%Y', '%b %Y', '%Y/%b/%d'):
try:
pd.to_datetime(data['date'], format=fmt)
except ValueError:
pass
data['date'] = data.apply(DateFormat, axis = 1)
应用日期格式之前: |编号 |日期 | | --- | -------------- | | 1 | 2023 年 1 月 2 日 | | 2 | 2016 年 4 月 2 日 | | 3 | 2021 年 6 月 | | 4 | 2023/12/01 |
应用日期格式后: |编号 |日期 | | --- | ----- | | 1 | None | | 2 | None | | 3 | None | | 4 | None |
如果您不使用 return
到 return 值,那么它将在函数末尾使用 return None
。
你应该使用return pd.to_datetime(...)
如果你想 return 无法转换的原始值,那么最后需要 return
。或者你可以使用 return
到 return 一些默认值。
def DateFormat(data):
for fmt in ('%b %d, %Y', '%d/%m/%Y', '%b %Y', '%Y/%b/%d'):
try:
return pd.to_datetime(data['date'], format=fmt)
except ValueError:
pass
# return original `date` if it couldn't convert
return data['date']
# or return some default value
#return datetime.datetime(1900, 1, 1)
编辑:
最少的工作代码。
我还添加了来自@Corralien 答案的代码,它也适用于此数据。
import pandas as pd
# --- functions ---
def parse_date(row):
# I had to add `'%Y/%m/%d'`
for fmt in ('%b %d, %Y', '%d/%m/%Y', '%b %Y', '%Y/%b/%d', '%Y/%m/%d'):
try:
return pd.to_datetime(row['date'], format=fmt)
except ValueError:
pass
# --- main ---
data = pd.DataFrame({
'date': ['01/02/2023', 'Apr 02, 2016', 'Jun 2021', '2023/12/01']
})
data['new_date_1'] = data.apply(parse_date, axis=1)
data['new_date_2'] = pd.to_datetime(data['date'], dayfirst=True)
print(data)
结果:
date new_date_1 new_date_2
0 01/02/2023 2023-02-01 2023-02-01
1 Apr 02, 2016 2016-04-02 2016-04-02
2 Jun 2021 2021-06-01 2021-06-01
3 2023/12/01 2023-12-01 2023-12-01
为什么不让 Pandas 推断您的日期时间格式?并强制 dayfirst=True
作为你的第一个日期格式 (%d/%m/%Y
)
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)
print(df)
# Output
ID Date
0 1 2023-02-01
1 2 2016-04-02
2 3 2021-06-01
3 4 2023-12-01