在Python中解析rfc3339日期字符串?

Spe*_*her 98 python date rfc3339 datetime-parsing

我有一个数据集,其中所有日期都具有以下格式:

2012-10-09T19:00:55Z
Run Code Online (Sandbox Code Playgroud)

我希望能够使用像.weekday他们这样的方法.如何在Python中将它们转换为正确的格式?

Ffi*_*ydd 167

您可以使用dateutil.parser.parse将字符串解析为datetime对象.

dateutil.parser.parse将尝试猜测你的字符串的格式,如果你事先知道确切的格式,那么你可以使用datetime.strptime你提供的格式字符串(参见Brent Washburne的回答).

from dateutil.parser import parse

a = "2012-10-09T19:00:55Z"

b = parse(a)

print(b.weekday())
# 1 (equal to a Tuesday)
Run Code Online (Sandbox Code Playgroud)

  • @kraxor可能是因为它实际上并不是Python的一部分,而是第三部分的库.`git clone http://example.com/module/problemsolver problemsolver && cd problemsolver && python problemsolver.py myspecificproblem` (22认同)
  • 我不知道为什么我没有听说过`dateutil.parser`.这些是使Python非常棒的小东西.`from somemodule import problemsolver && problemsolver.solvemyspecificproblem()` (16认同)
  • 你需要表明我们是第三方lib (14认同)
  • @kraxor Python很棒,因为它解决了如何解析日期需要安装第三方库?这看起来有点不太棒. (5认同)
  • @Ffisegydd我的错误,我做了'pip install dateutil'而不是使用python-. (2认同)

Bre*_*rne 89

这里已经回答了这个问题:如何将ISO 8601日期时间字符串转换为Python日期时间对象?

d = datetime.datetime.strptime( "2012-10-09T19:00:55Z", "%Y-%m-%dT%H:%M:%SZ" )
d.weekday()
Run Code Online (Sandbox Code Playgroud)

  • @ AlexNorth-Keys:这个怎么样不是最理想的?OP表示"我有一个数据集,其中所有日期都具有以下格式",并未提及任何变体.这个答案实际上是最佳的,因为它不需要任何外部模块,它使用内置的datetime模块.通过使用确切的格式字符串(而不是每次都使用dateutil猜测格式),代码性能是最佳的. (9认同)
  • 我从维护的角度思考(oops) - 但是你是对的,strptime方法更快,在dateutil.parser方法的大约1/6时间运行. (4认同)
  • `"%Y-%m-%dT%H:%M:%SZ"` 生成一个“天真的”日期时间。要生成“感知”日期时间(即感知时区): `"%Y-%m-%dT%H:%M:%S%z"` (3认同)
  • 这是次优的,因为它要求调用者为相当广泛的 ISO 8601 变体提供格式字符串(除非如果省略秒则喜欢 ValueError )。另一方面,dateutil 解析器可以更好地处理这些问题。 (2认同)

bru*_*ton 10

你应该看看moment哪个是优秀的js lib的python端口momentjs.

它的一个优点是支持ISO 8601字符串格式,以及通用的"%格式":

import moment
time_string='2012-10-09T19:00:55Z'

m = moment.date(time_string, '%Y-%m-%dT%H:%M:%SZ')
print m.format('YYYY-M-D H:M')
print m.weekday
Run Code Online (Sandbox Code Playgroud)

结果:

2012-10-09 19:10
2
Run Code Online (Sandbox Code Playgroud)