【问题标题】:Convert other time values to datetime format in Python在 Python 中将其他时间值转换为日期时间格式
【发布时间】:2012-11-01 07:14:04
【问题描述】:

我有一次显示为:

2012-11-12 15:16:08.648521

另一个时间显示为:

14:44:02 Mon Nov 12 2012

有什么方法可以将第二时间格式转换为第一时间格式(例如 14:44:02 Mon Nov 12 2012 变成 2012-11-12 14:44:02.????? )?我需要将第二个日期(从日志中提取)与另一个日期进行比较,以确认我得到了正确的文件。

【问题讨论】:

标签: python date time module compare


【解决方案1】:

试试

datetime.strptime("14:44:02 Mon Nov 12 2012", "%H:%M:%S %a %m %d %Y").strftime("%Y-%m-%d %H:%M:%S.%f")

【讨论】:

  • .648521明显是微秒,可以用%f解析。
【解决方案2】:

datetime.datetime.strptime

您只需为每种格式编写格式规范,将两个值都转换为datetime 对象,然后进行比较。 (您可以将一种字符串格式转换为另一种格式并比较字符串,但这并不像想法那么好,我将在下面解释。)

例如:

>>> import datetime
>>> fmt1 = '%Y-%m-%d %H:%M:%S.%f'
>>> fmt2 = '%H:%M:%S %a %b %d %Y'
>>> s1 = '2012-11-12 15:16:08.648521'
>>> s2 = '14:44:02 Mon Nov 12 2012'
>>> dt1 = datetime.datetime.strptime(s1, fmt1)
>>> dt2 = datetime.datetime.strptime(s2, fmt2)
>>> cmp(dt1, dt2)
1
>>> dt1
datetime.datetime(2012, 11, 12, 15, 16, 8, 648521)
>>> dt2
datetime.datetime(2012, 11, 12, 14, 44, 2)

请注意,您的一种时间格式包括微秒,而另一种则不包括,这意味着只有当第一个恰好位于第二个标记处(以 .000000 结尾)时,它们实际上才会相等。如何处理这取决于你想要做什么。

例如,如果你想四舍五入到最接近的秒,你可以这样做:

dt1 = datetime.datetime(dt1.year, dt1.month, dt1.day, 
                        dt1.hour, dt1.minute, 
                        dt1.second + (1 if dt1.microsecond >= 500000 else 0), 0)

或者,如果您想检查某个 delta 范围内的相等性:

abs(dt2 - dt1) < datetime.timedelta(0, 1)

您可能会遇到的另一个问题是时区。如果其中一个日期是本地日期,另一个是 GMT,则您必须在解析后转换其中一个。

您最初的问题是询问如何将一种格式转换为另一种格式。您可以这样做,然后将它们作为字符串进行比较,但最好将它们作为实际的datetime 值进行比较。一方面,如果将它们都转换为第二种格式,它们甚至不能正确地作为字符串进行比较(14:44:02 Mon Nov 12 2012 小于 15:44:02 Sun Nov 11 2012,即使是 23 小时后)。它还使处理微秒、时区等变得更加复杂。但是如果你真的想做,strftimestrptime 的反函数:

>>> datetime.datetime.strftime(dt2, fmt1)
'2012-11-12 14:44:02.00000'

【讨论】:

  • 我刚试过做 otime = "14:22:20 Mon Nov 12 2012 "和 datetime.strptime(str(otime), "%Y-%m-%d %H:%M: %S"),但我收到格式不匹配的错误
  • @EGr:嗯,是的,那是因为格式不匹配。您在那里使用的格式尝试将14 部分解析为%Y(4 位数年份),将: 部分解析为- 等。但是用正确的格式解析它会正常工作,如我上面的示例所示。
  • 啊,好吧。我没有意识到我需要输入的格式是它当前的格式,而不是我想要的格式。谢谢!
  • @EGr:你真的不想把它变成任何格式——最好将它们都转换为datetime对象并直接使用它们。
  • 还可能值得注意的是,如果您想转储已解析的日期,第一种格式是 ISO 8601,任何 datetime 对象都可以使用 datetime.isoformat(' ') [这里使用分隔符的空间,默认为'T']
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 2021-03-15
  • 2019-04-27
  • 1970-01-01
  • 2017-12-09
  • 2015-03-23
相关资源
最近更新 更多