Python将字符串转换为datetime以与datetime对象进行比较

时间:2016-07-28 01:29:24

标签: python python-2.7 datetime strptime

我有一个字符串lfile,其中包含日期时间(type(lfile)给出<type 'str'>)和一个Python日期时间对象wfile。这是代码:

import os, datetime
lfile = '2005-08-22_11:05:45.000000000'
time_w = os.path.getmtime('{}\\{}.py' .format('C:\Temp_Readouts\RtFyar','TempReads.csv'))
wfile = datetime.datetime.fromtimestamp(time_w)

wfile包含此2006-11-30 19:08:06.531328,而repr(wfile)包含:

datetime.datetime(2006, 11, 30, 19, 8, 6, 531328)

问题:

我需要:

  1. lfile转换为Python日期时间对象
  2. lfilewfile进行比较并确定哪个日期时间更近
  3. 1:

    根据here,我只能使用strptime获得部分解决方案。这是我试过的:

    lfile = datetime.datetime.strptime(linx_file_dtime, '%Y-%m-%d_%H:%M:%S')
    

    输出结果为:

    `ValueError: unconverted data remains: .000`
    

    问题1

    似乎strptime() cannot处理纳秒秒。如何告诉strptime()忽略最后3个零?

    2:

    当我使用type(wfile)时,我得到<type 'datetime.datetime'>。如果wfilelfile都是Python日期时间对象(即如果步骤1成功),那么this会工作吗?:

    if wtime < ltime:
        print 'Linux file created after Windows file'
    else:
        print 'Windows file created after Linux file'
    

    问题2

    还是有其他方法可以让Python比较日期时间对象以确定两者中哪一个发生在另一个之后?

2 个答案:

答案 0 :(得分:2)

问题1

Python处理微秒,而不是纳秒。您可以删除时间的最后三个字符,将其转换为微秒,然后将.%f添加到结尾:

lfile = datetime.datetime.strptime(linx_file_dtime[:-3], '%Y-%m-%d_%H:%M:%S.%f')

问题2

是的,比较有效:

if wtime < ltime:
    ...

答案 1 :(得分:1)

没错,strptime()不能处理纳秒。您链接到的问题中接受的答案提供了一个选项:去除最后3位数字,然后使用附加到格式字符串的.%f进行解析。

另一种选择是使用dateutil.parser.parse()

>>> from dateutil.parser import parse
>>> parse('2005-08-22_11:05:45.123456789', fuzzy=True)
datetime.datetime(2005, 8, 22, 11, 5, 45, 123456)

fuzzy=True需要忽略日期和时间组件之间不受支持的下划线。由于datetime个对象不支持纳秒,因此最后3个数字消失,留下微秒精度。