您如何將以下日期列轉換為單個格式化的日期列?
df = pd.DataFrame(data={'datecol': ["-",
"44198",
"2021/01/01",
"14.04.20",
"2021-13-03"]})
print(df.dropna()) 應回傳以下結果:
datecol
0 2021-01-02
1 2021-01-01
2 2020-04-14
3 2021-03-13
謝謝!
uj5u.com熱心網友回復:
- 使用 轉換所有有效的日期時間格式
pd.to_datetime,為無法識別的格式指定格式 - 轉換所有整數 (Excel) 日期。
- 兩者結合
fillna
parsed = pd.to_datetime(df["datecol"], errors="coerce").fillna(pd.to_datetime(df["datecol"],format="%Y-%d-%m",errors="coerce"))
ordinal = pd.to_numeric(df["datecol"], errors="coerce").apply(lambda x: pd.Timestamp("1899-12-30") pd.Timedelta(x, unit="D"))
df["datecol"] = parsed.fillna(ordinal)
>>> df
datecol
0 NaT
1 2021-01-02
2 2021-01-01
3 2020-04-14
4 2021-03-13
uj5u.com熱心網友回復:
如果一列包含多種格式,您將需要使用不同的格式多次決議該列并用于combine_first組合結果資訊。因為我們指定errors='coerce'的日期格式應該只匹配其中一種格式。
另一個小問題是您的某些格式要求您只指定format引數,而其他格式則需要origin和unit引數。我們可以處理這個將 dict 傳遞kwargs給pd.to_datetime函式的問題。
請注意,任何數值都可以使用origin,unit因此如果日期列的值代表同一列中具有不同偏移量的不同單位,則不能使用此方法。在這種情況下,您需要提供其他邏輯來指示哪些單位和偏移量與哪些行相關。
import pandas as pd
from functools import reduce
kwl = [{'format': '%Y/%m/%d'},
{'format': '%d.%m.%y'},
{'format': '%Y-%d-%m'},
{'format': '%Y/%m/%d'},
{'unit': 'd', 'origin': '1899-12-30'}]]
l = []
for kwargs in kwl:
if 'unit' in kwargs.keys():
s = pd.to_numeric(df['datecol'], errors='coerce')
else:
s = df['datecol']
l.append(pd.to_datetime(s, errors='coerce', **kwargs))
result = reduce(lambda l,r: l.combine_first(r), l)
print(result)
#0 NaT
#1 2021-01-02
#2 2021-01-01
#3 2020-04-14
#4 2021-03-13
Name: datecol, dtype: datetime64[ns]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/382525.html
