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

3 投票
3 回答
10567 浏览
提问于 2025-04-16 14:09

我在一个日志文件里有一个时间戳,格式是这样的:

2010-01-01 18:48:14.631829

我试过一些常用的方法,比如用strptime来处理,但无论我怎么做,它总是告诉我这个时间戳和我指定的格式不匹配。("%Y-%m-%d %H:%M:%S" 或 "%Y-%m-%d %H:%M:%S.%f")

我甚至尝试过用“.”来分割这个值,这样我就可以只比较没有微秒部分的值,但它还是告诉我不匹配:“%Y-%m-%d %H:%M:%S”

唉,我只想做一个简单的时间差计算,哈哈。为什么Python的时间处理这么复杂呢?有time、datetime,还有其他各种导入的模块。

3 个回答

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微秒。想了解timedelta对象的更多信息,可以查看datetime文档

编辑:如果你不能使用%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)
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)
>>> 
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)

撰写回答