转换不带前导零的字符串日期

4

我从一个非常规的数据源获取我的数据和一些日期,因此字符串日期存在一些细微差异。最大的区别是某些日期中天数没有用零填充,日期后可能有一个空格(例如日期 2/9 /2018),月份也没有用零填充。当我尝试使用 datetime.strptime 函数时,会出现 "time data does not match format '%m %d %Y' " 的错误。请问如何将这样存在细微差异的日期列转换? 请参考下面的代码和示例数据。

d_o = datetime.datetime.strptime(df['start'][1], '%m %d %Y')
  • 2018年1月26日
  • 2018年1月26日
  • 2018年2月2日
  • 2018年2月2日
  • 2018年2月9日
  • 2018年2月9日
  • 2018年1月19日
  • 2018年1月19日
  • 2018年1月26日
  • 2018年1月26日
  • 2018年2月2日
  • 2018年2月2日
  • 2018年2月9日
2个回答

1

你应该使用第三方库dateutil,这个库可以接受各种不同格式的日期,但性能可能有所牺牲。

from dateutil import parser

lst = ['1/26/2018', '1/26/2018', '2/2/2018', '2/2/2018', '2/9 /2018', '2/9 /2018',
       '1/19/2018', '1/19/2018', '1/26/2018', '1/26/2018', '2/2/2018', '2/2/2018',
       '2/9 /2018']

res = [parser.parse(i) for i in lst]

结果:

[datetime.datetime(2018, 1, 26, 0, 0),
 datetime.datetime(2018, 1, 26, 0, 0),
 datetime.datetime(2018, 2, 2, 0, 0),
 datetime.datetime(2018, 2, 2, 0, 0),
 datetime.datetime(2018, 2, 9, 0, 0),
 datetime.datetime(2018, 2, 9, 0, 0),
 datetime.datetime(2018, 1, 19, 0, 0),
 datetime.datetime(2018, 1, 19, 0, 0),
 datetime.datetime(2018, 1, 26, 0, 0),
 datetime.datetime(2018, 1, 26, 0, 0),
 datetime.datetime(2018, 2, 2, 0, 0),
 datetime.datetime(2018, 2, 2, 0, 0),
 datetime.datetime(2018, 2, 9, 0, 0)]

1
您可以使用re.splitstr.zfill

import re
dates = ['1/26/2018', '1/26/2018', '2/2/2018', '2/2/2018', '2/9 /2018', '2/9 /2018', '1/19/2018', '1/19/2018', '1/26/2018', '1/26/2018', '2/2/2018', '2/2/2018', '2/9 /2018']
new_dates = ['{}/{}/{}'.format(a.zfill(2), *b) for a, *b in map(lambda x:re.split('[/\s]+', x), dates)]

输出:

['01/26/2018', '01/26/2018', '02/2/2018', '02/2/2018', '02/9/2018', '02/9/2018', '01/19/2018', '01/19/2018', '01/26/2018', '01/26/2018', '02/2/2018', '02/2/2018', '02/9/2018']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接