使用Python读取包含微秒时间戳的日志文件

3
我在一个日志文件中得到了一个时间戳,格式如下:
2010-01-01 18:48:14.631829

我已经尝试了像strptime这样的常见方法,但无论我做什么,都会得到它不匹配我指定的格式的结果。("%Y-%m-%d %H:%M:%S" OR "%Y-%m-%d %H:%M:%S.%f") 我甚至尝试通过"."拆分值,以便可以将其与没有微秒的值进行比较,但它仍然告诉我不匹配:"%Y-%m-%d%H:%M:%S"
呃,我只需要一个简单的时间差,哈哈。为什么Python的时间处理如此分散?有time、datetime和其他各种导入。
3个回答

4
您可以这样使用strptime(仅适用于Python 2.6+):
>>> import datetime
>>> s = "2010-01-01 18:48:14.631829"
>>> datetime.datetime.strptime(s, "%Y-%m-%d %H:%M:%S.%f")
datetime.datetime(2010, 1, 1, 18, 48, 14, 631829)

文档:http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior

...

%f 微秒,小数点后六位 [0,999999],左侧补零

...

如果您使用的是2.5-版本,并且不关心微秒,可以直接截去:

>>> import re
>>> datetime.datetime.strptime(re.sub('\..*', '', s), "%Y-%m-%d %H:%M:%S")
datetime.datetime(2010, 1, 1, 18, 48, 14)

1
%f 是一个错误的指令。我猜是因为我使用的是 Python 2.5? - captrap
1
啊,是的,在Python 2.5中我遇到了ValueError: 'f' is a bad directive in format '%Y-%m-%d %H:%M:%S.%f'错误 - 以前从未注意到。 - miku
好的。使用这种方法分离微秒足够有效了,谢谢=D - captrap

0

当然,分割字符串是有效的:

>>> print s
2010-01-01 18:48:14.631829
>>> time.strptime(s.split('.')[0], "%Y-%m-%d %H:%M:%S")
time.struct_time(tm_year=2010, tm_mon=1, tm_mday=1, tm_hour=18, tm_min=48, tm_sec=14, tm_wday=4, tm_yday=1, tm_isdst=-1)
>>> 

0
以下适用于我(Python 2.6):
>>> import datetime
>>> string1 = '2010-01-01 18:48:14.631829'
>>> string2 = '2010-01-09 13:04:39.540268'
>>> time1 = datetime.datetime.strptime(string1, '%Y-%m-%d %H:%M:%S.%f')
>>> time2 = datetime.datetime.strptime(string2, '%Y-%m-%d %H:%M:%S.%f')
>>> time2 - time1
datetime.timedelta(7, 65784, 908439)

即,两个日期之间相差7天、65784秒和908439微秒。请参阅datetime文档了解有关timedelta对象的信息。

编辑:如果您无法使用%f指令,请尝试以下操作:

>>> time1 = datetime.datetime.strptime(string1.split('.')[0], '%Y-%m-%d %H:%M:%S')
>>> time2 = datetime.datetime.strptime(string2.split('.')[0], '%Y-%m-%d %H:%M:%S')
>>> time2 - time1
datetime.timedelta(7, 65785)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接