簡體   English   中英

用於檢查所有類型的日期格式的正則表達式模式

[英]Regex pattern for checking all type of Date format

我想檢查 dataframe 的哪一列中存在的日期值,並將該列轉換為日期時間,因為列類型最初可以是 object,但日期可以是以下任何格式。 所以我正在尋找一個匹配所有日期類型格式的正則表達式模式。

  1. 04/10/2022
  2. 10/04/2022
  3. 2022/04/10
  4. 2022/10/04
  5. 2022-12-20 00:00:00
  6. 04-10-2022

有人可以建議一個匹配所有日期格式的正則表達式模式嗎?

我試過下面的代碼:

    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])

#Output:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM