[英]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.