python - 使用 Python 在日期时间范围之间解析日志
问题描述
我正在尝试创建一个动态函数:我给出了两个日期时间值,它可以读取这些日期时间值之间的日志,例如:
start_point = "2019-04-25 09:30:46.781"
stop_point = "2019-04-25 10:15:49.109"
我正在考虑检查的算法:
- 如果日期相等:
- 检查开始小时 0 char (09 -> 0) 是否高于或小于停止小时 0 char (10 -> 1);
- 与小时 1 char ((start) 09 -> 9, (stop) 10 -> 0) 进行相同的检查;
- 与分钟 0 字符进行相同的检查;
- 与分钟 1 字符进行相同的检查;
- 如果日期不同:
- 其他一些检查...
我不知道我是不是又在发明轮子,但我真的迷路了,我会列出我尝试过的东西:
1.
...
cmd = subprocess.Popen(['egrep "2019-04-19 ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9].[0-9]{3}" file.log'], shell=True, stdout=subprocess.PIPE)
cmd_result = cmd.communicate()[0]
for i in str(cmd_result).split("\n"):
print(i)
...
这个问题:我添加了示例中的值,但它无法工作,因为它具有无效范围,例如小时 1 字符它创建范围 [9-0]、分钟字符 0 以及 [3-1] 等.
2.从The best way to filter a log by a date range in python尝试了以下解决方案
任何帮助表示赞赏。
编辑
日志行结构:
...
2019-04-25 09:30:46.781 text text text ...
2019-04-25 09:30:46.853 text text text ...
...
编辑 2
所以我尝试了代码:
from datetime import datetime as dt
s1 = "2019-04-25 09:34:11.057"
s2 = "2019-04-25 09:59:43.534"
start = dt.strptime('2019-04-25 09:34:11.057','%Y-%m-%d %H:%M:%S.%f')
stop = dt.strptime('2019-04-25 09:59:43.534', '%Y-%m-%d %H:%M:%S.%f')
start_1 = dt.strptime('09:34:11.057','%H:%M:%S.%f')
stop_1 = dt.strptime('09:59:43.534','%H:%M:%S.%f')
with open('file.out','r') as file:
for line in file:
ts = dt.strptime(line.split()[1],'%H:%M:%S.%f')
if (ts > start_1) and (ts < stop_1):
print line
我得到了错误
ValueError: time data 'Platform' does not match format '%H:%M:%S.%f'
所以看来我发现它有时在行开始时包含非日期时间的另一个问题。有没有办法提供一个我提供日期时间格式的正则表达式?
编辑 3
修复了字符串出现在行首导致 ValueError 和固定索引超出范围错误时可能出现其他值的问题:
try:
ts = dt.strptime(line.split()[1],'%H:%M:%S.%f')
if (ts > start_1) and (ts < stop_1):
print line
except IndexError as err:
continue
except ValueError as err:
continue
所以现在它不在我提供的范围内列出,现在它读取日志 FROM 2019-02-27 09:38:46.229
TO 2019-02-28 09:57:11.028
。有什么想法吗?
解决方案
您的编辑 2 有正确的想法。您需要进行异常处理以捕获格式不正确的行并跳过它们,例如空白行或没有时间戳的行。这可以按如下方式完成:
from datetime import datetime
s1 = "2019-04-25 09:24:11.057"
s2 = "2019-04-25 09:59:43.534"
fmt = '%Y-%m-%d %H:%M:%S.%f'
start = datetime.strptime(s1, fmt)
stop = datetime.strptime(s2, fmt)
with open('file.out', 'r') as file:
for line in file:
line = line.strip()
try:
ts = datetime.strptime(' '.join(line.split(' ', maxsplit=2)[:2]), fmt)
if start <= ts <= stop:
print(line)
except:
pass
整个时间戳用于创建ts
,这样可以正确地与start
and进行比较stop
。
每行首先删除尾随换行符。然后在空间上最多拆分两次。然后将前两个拆分重新连接在一起并转换为一个datetime
对象。如果失败,则意味着您没有正确格式化的行。
推荐阅读
- java - Java MOOC 练习 80 骰子(需要帮助解释)
- c# - 增加旧值 FluentMigrator
- android-studio - Android Studio 3.4 等待应用上线
- regex - 除包含“000”的字符串外的任何数字字符串
- html - 如何使动画代码在 css 中工作?[代码对我不起作用...]
- php - 匹配重复的单词
- r - 在闪亮的 flexdashboard 上加载 RBioFormat 时出错
- javascript - React 为组件添加了一个“未定义”的类
- javascript - Dollarsign 标签不起作用,我该如何解决
- android - 将一项添加到数据库后,LiveData 未通知所有项