【发布时间】:2019-11-30 22:52:34
【问题描述】:
我有一个以多种格式列出日期的数据框。例如:
date
201 July 17,2019
555 06-06-2019
295 28/3/2019
有没有办法将所有这些日期转换为datetime?
【问题讨论】:
标签: python pandas date datetime
我有一个以多种格式列出日期的数据框。例如:
date
201 July 17,2019
555 06-06-2019
295 28/3/2019
有没有办法将所有这些日期转换为datetime?
【问题讨论】:
标签: python pandas date datetime
Edit 以获得更好的答案。通常对于这样的任务,您会使用pandas.Series.dt.strftime() 将整个列转换为特定的DateTime 格式,但由于您似乎在不同的行中有不同的格式,您可能应该改为查看datetime.strptime()。
遍历Date 的那一列,通过if(或try)语句更改日期(伪代码用于演示):
for date in date_column:
if "," in date:
# strptime()
elif "-" in date:
# strptime()
elif "/" in date:
dt = datetime.strptime(date, "%d/%m/%y")
column_row = dt
Here 是strftime() 格式代码,您需要设置函数的第二个参数。
您也可以使用dateutil.parser.parse 来执行此操作(请务必先通过pip install python-dateutil 安装它):
from dateutil.parser import parse
df['date'] = df.date.apply(parse)
例如:
from dateutil.parser import parse
import pandas as pd
import numpy as np
def parse_date(date):
if date is np.nan:
return np.nan
else:
return parse(date)
df = pd.DataFrame(
{
"date": [
"July 17,2019",
"06-06-2019",
"28/3/2019",
"12/3/19",
"31-12-19",
np.nan,
],
"text": ["t1", "t2", "t3", "t4", "t5", "t6"],
}
)
df["date"] = df.date.apply(parse_date)
转换:
date text
0 July 17,2019 t1
1 06-06-2019 t2
2 28/3/2019 t3
3 12/3/19 t4
4 31-12-19 t5
5 NaN t6
到
date text
0 2019-07-17 t1
1 2019-06-06 t2
2 2019-03-28 t3
3 2019-12-03 t4
4 2019-12-31 t5
5 NaT t6
您也可以通过使用lambda 表达式来完成与函数相同的操作,如下所示:
df["date"] = df.date.apply(lambda date: np.nan if date is np.nan else parse(date))
【讨论】:
date 而不是column_row? (顺便说一句,感谢这个极好的建议。)
dateutil 的想法更新了上面的答案,这是一个强大的Python 模块,可以满足您的需求。
我会创建一个应用函数来检查正则表达式,并根据该正则表达式返回日期时间,运行 if/elif 命令列表并返回结果,例如:
def checkdate(x):
if pd.Series(x).str.contains(r'\w+ \d+,\d+')[0]:
return datetime.datetime.strptime(x, '%B %d,%Y')
#elif next str.contains, etc
else:
return np.nan
df.date.apply(checkdate)
采样
0 2019-07-17
1 NaT
2 NaT
然后您可以使用 df = df.date.apply(checkdate) 将日期列重置为这些值
【讨论】:
df.col.apply 的精彩使用。通过添加此内容更新了我的答案,但使用了dateutil。 +1