[英]Regex pattern for checking all type of Date format
我想檢查 dataframe 的哪一列中存在的日期值,並將該列轉換為日期時間,因為列類型最初可以是 object,但日期可以是以下任何格式。 所以我正在尋找一個匹配所有日期類型格式的正則表達式模式。
有人可以建議一個匹配所有日期格式的正則表達式模式嗎?
我試過下面的代碼:
for columnIndex, colName in enumerate(df):
df2 = pd.DataFrame()
df2['test'] = df[colName]
count = 0
for i, j in df2.iteritems():
for k in j:
if re.match("[0-9]{2}/[0-9]{2}/[0-9]{4}", str(k)):
count = count+1
if(count>5):
df[colName] = pd.to_datetime(df[colName])
print(df.dtypes)
考慮以下 dataframe df
以及問題中 OP 指示的所有日期格式
df = pd.DataFrame({'date': ['04/10/2022', '10/04/2022', '2022/04/10', '2022/10/04', '2022-12-20 00:00:00', '04-10-2022']})
[Out]:
date
0 04/10/2022
1 10/04/2022
2 2022/04/10
3 2022/10/04
4 2022-12-20 00:00:00
5 04-10-2022
假設目標是轉換為日期時間,可以使用pandas.to_datetime
。 這具有可以按如下方式使用的參數infer_datetime_format
df['date'] = pd.to_datetime(df['date'], infer_datetime_format=True)
[Out]:
date
0 2022-04-10
1 2022-10-04
2 2022-04-10
3 2022-10-04
4 2022-12-20
5 2022-04-10
對於這種情況,它完成了工作。
筆記:
為什么不簡單地使用pandas.to_datetime
而不提供任何格式?
for col in df.columns:
df[col] = pd.to_datetime(df[col])
print(df)
Col1 Col2 Col3 Col4
0 2022-04-10 NaT NaT NaT
1 NaT 2022-10-04 NaT NaT
2 NaT NaT 2022-04-10 NaT
3 2022-10-04 NaT NaT NaT
4 NaT NaT NaT 2022-12-20
5 2022-04-10 NaT NaT NaT
Col1 Col2 Col3 Col4
0 04/10/2022 NaN NaN NaN
1 NaN 10/04/2022 NaN NaN
2 NaN NaN 2022/04/10 NaN
3 2022/10/04 NaN NaN NaN
4 NaN NaN NaN 2022-12-20 00:00:00
5 04-10-2022 NaN NaN NaN
這是一個想法。 使用此代碼,您將匹配所有格式,但是如果日期是05/05/2022
,則您無法區分天數和月份。 但這是一個超出問題 scope 的問題。
我想出的正則表達式查找由破折號或斜杠“[/-]”分隔的一個或多個數字[0-9]+
的組,我使用反斜杠來轉義特殊符號。
dates="""04/10/2022
10/04/2022
2022/04/10
2022/10/04
2022-12-20 00:00:00
04-10-2022"""
import re
dre = re.compile(r"([0-9]+)[\/\-]([0-9]+)[\/\-]([0-9]+)")
for date in dates.split("\n"):
m = dre.match(date)
print( m.group(1) , m.group(2) , m.group(3) )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.