关于日期:在python中将其他时间值转换为datetime格式

Convert other time values to datetime format in Python

我有一次是这样的:

1
2012-11-12 15:16:08.648521

另一个时间显示为:

1
14:44:02 Mon Nov 12 2012

是否有任何方法可以将第二次格式转换为第一次格式(例如,2012年11月12日星期一14:44:02变为2012-11-12 14:44:02.??????)?我需要将第二个日期(从日志中提取)与另一个日期进行比较,以确认我得到了正确的文件。


看看datetime.datetime.strptime。

您只需要为每个格式编写一个格式规范,将这两个值转换为datetime对象,然后比较它们。(您可以将一种字符串格式转换为另一种格式并比较字符串,但这不如下面我将解释的那样好。)

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> 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结尾)时,它们才实际相等。如何处理这取决于你想做什么。

例如,如果要四舍五入到最接近的秒,可以执行以下操作:

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

或者,如果要检查某个增量范围内的相等性:

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

你可能遇到的另一个问题是时区。如果其中一个日期是本地日期,另一个是格林尼治标准时间,则必须在解析后转换其中一个日期。

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

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


尝试

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")