我有一個代表日期的列,但是被格式化為字串。我不能使用簡單的 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 | 無 | | 2 | 無 | | 3 | 無 | | 4 | 無 |
uj5u.com熱心網友回復:
如果您不使用return回傳值,則它return None在函式末尾使用。
你應該使用return pd.to_datetime(...)
如果您想在無法轉換時回傳原始值,那么最后需要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
uj5u.com熱心網友回復:
為什么不讓 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/447511.html
