Python 将字符串转换为日期时间以便与日期时间对象进行比较
Python convert string to datetime for comparison to datetime object
我有一个字符串 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)
问题:
我需要:
- 将
lfile
转换为 Python 日期时间对象
- 比较
lfile
和 wfile
并确定哪个日期时间更近
对于 1.:
根据 here,我只能使用 strptime
获得部分解决方案。这是我尝试过的:
lfile = datetime.datetime.strptime(linx_file_dtime, '%Y-%m-%d_%H:%M:%S')
输出为:
`ValueError: unconverted data remains: .000`
问题一
似乎 strptime()
cannot 处理纳秒。我如何告诉 strptime()
忽略最后 3 个零?
对于 2.:
当我使用 type(wfile)
时,我得到 <type 'datetime.datetime'>
。如果 wfile
和 lfile
都是 Python 日期时间对象(即如果第 1 步成功),那么 this 会工作吗?:
if wtime < ltime:
print 'Linux file created after Windows file'
else:
print 'Windows file created after Linux file'
问题二
或者是否有其他方法 Python 可以比较 datetime 对象以确定两者中哪个发生在另一个之后?
问题 1
Python 处理微秒,而不是纳秒。你可以去掉时间的最后三个字符,将其转换为微秒,然后在末尾添加.%f
:
lfile = datetime.datetime.strptime(linx_file_dtime[:-3], '%Y-%m-%d_%H:%M:%S.%f')
问题二
是的,比较有效:
if wtime < ltime:
...
没错,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 位数字消失,留下微秒精度。
我有一个字符串 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)
问题:
我需要:
- 将
lfile
转换为 Python 日期时间对象 - 比较
lfile
和wfile
并确定哪个日期时间更近
对于 1.:
根据 here,我只能使用 strptime
获得部分解决方案。这是我尝试过的:
lfile = datetime.datetime.strptime(linx_file_dtime, '%Y-%m-%d_%H:%M:%S')
输出为:
`ValueError: unconverted data remains: .000`
问题一
似乎 strptime()
cannot 处理纳秒。我如何告诉 strptime()
忽略最后 3 个零?
对于 2.:
当我使用 type(wfile)
时,我得到 <type 'datetime.datetime'>
。如果 wfile
和 lfile
都是 Python 日期时间对象(即如果第 1 步成功),那么 this 会工作吗?:
if wtime < ltime:
print 'Linux file created after Windows file'
else:
print 'Windows file created after Linux file'
问题二
或者是否有其他方法 Python 可以比较 datetime 对象以确定两者中哪个发生在另一个之后?
问题 1
Python 处理微秒,而不是纳秒。你可以去掉时间的最后三个字符,将其转换为微秒,然后在末尾添加.%f
:
lfile = datetime.datetime.strptime(linx_file_dtime[:-3], '%Y-%m-%d_%H:%M:%S.%f')
问题二
是的,比较有效:
if wtime < ltime:
...
没错,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 位数字消失,留下微秒精度。