使用包含錯誤的不一致字串格式的日期列簡化了巨大的 df:
df_length = 10000
df = pd.DataFrame({
"to_ignore": np.random.randint(1, 500, df_length),
"date": np.random.choice(["11 Nov 2018", "Feb 2019", "2021-11-02", "asdf"], df_length),
})
我們需要將datecol轉換為 datetime,但找不到在可用時間內不會丟棄資料或行程的解決方案。嘗試使用以下格式連續格式化errors='ignore':
df['date'] = pd.to_datetime(df['date'], format='%b %Y', errors='ignore')
df['date'] = pd.to_datetime(df['date'], format='%d %b %Y', errors='ignore')
但是對于錯誤的字串(“asdf”),col 似乎不受影響。連續嘗試格式errors='coerce'顯然會丟失資料。
我們嘗試了dateparser , df['date'] = df['date'].apply(lambda x: dateparser.parse(x)),它有點作業,只是它有時會出錯(2019-02-02 應該是 2019-02-01):
to_ignore date
0 115 2019-02-02
1 285 NaT
...
這也太慢了(玩df_length)。
有什么好方法可以做到這一點?
uj5u.com熱心網友回復:
弄清楚了。df['date'] = pd.to_datetime(df['date'], errors='coerce')性能良好并捕獲常見格式。我的問題假設情況并非如此,因為我已糾正格式錯誤以幫助其他人避免混淆。
如果您需要捕獲復雜字串中的日期,您可以創建一個函式,dateparser.parse()以便在匹配正則運算式時根據需要使用:
def date_process(x):
if bool(re.search("^\D\D\D \d\d\d\d$", x)):
return dt.datetime.strptime(x, "%b %Y")
elif bool(re.search("^\d\d \D\D\D \d\d\d\d$", x)):
return dt.datetime.strptime(x, "%d %b %Y")
elif bool(re.search("^\d\d\d\d-\d\d-\d\d$", x)):
return dt.datetime.strptime(x, "%Y-%m-%d")
else:
return dateparser.parse(x)
df['date'] = df['date'].apply(date_process)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/351674.html
