求fi中存储的时间值之间的平均差值

2024-04-20 06:56:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件有时间和可重用的会话号。我试图找出这些会议的平均时间差。我会解释我做了什么,但我的逻辑会在特定的场景中中断。你知道吗

文件看起来像:-

<Date and time> session:1234 start
<Date and time> session:2345 start
<Date and time> session:3456 start
<Date and time> session:1234 stop
<Date and time> session:7890 start
<Date and time> session:4567 start
<Date and time> session:2345 stop
<Date and time> session:4567 stop
....

我所做的:-我按照会话编号排序,然后找到后续行的差异,然后平均所有这些差异。但是我得到了错误的值,因为这个文件也包含很少的“会话:xx开始没有“停止”和“很少”的行会话:xx停止没有“开始”的行。你知道吗

所以,我的问题是如何删除这些行。我的逻辑中断了,因为我盲目地按照会话号排列行,然后发现后续行之间的时间差。你知道吗

如果有别的办法,请告诉我。我很乐意尝试。 谢谢您!!你知道吗


Tags: and文件datetimesession时间场景差异
3条回答

我建议您继续为每个session_id创建一个字典,如下所示:

sessions = { 1234 : { start: DateTime, stop: DateTime} ... }

为了做到这一点,遍历文件的每一行并将会话id作为键(sessions[session_id])添加到sessions字典就足够了。对于每个会话,您都可以轻松地添加startstop键。你知道吗

稍后,您可以处理这个sessions字典并删除所有不同时包含startstopsession_id。用你的最终列表,你可以计算出差异,然后平均你的所有结果。你知道吗

我写了一个解决方案,假设如果我有两个连续的开始,我总是可以删除第一个,如果它们是按日期时间排序的

我稍微修改了输入文件,将date ad time替换为一个数字。该代码可以很容易地适应管理日期和时间。你知道吗

代码分为三个部分:

  1. 读取文件并将其解析为有用的数据结构
  2. 对每个会话的数据进行排序
  3. 删除不需要的元素

我的方法是:

import re
import collections

with open(your_file_name_here, 'r') as f:
    # parse each line in a dict like
    # {sessionid: [(time, start/stop), ...]}
    pattern = re.compile('(\d+) session:(\d+) (\w+)')
    lines = f.readlines()
    sessions = collections.defaultdict(list)
    for line in lines:
        m = re.match(pattern, line).groups()
        sessions[m[1]].append((m[0],m[2]))

    # for each session, sort the list
    # I kept this loop separate from the next one
    # since OP said he had data already sorted
    for k,v in sessions.items():
        sessions[k] = sorted(v, key=lambda x: x[0])

    # for each session remove unwanted elements
    for k, v in sessions.items():
        # group elements two by two
        # added a default element to manage the last element of the list
        for el in zip(v,v[1:]+[('','start')]):
            if el[0][1] == 'start' and el[1][1] == 'start':
                v.remove(el[0])

文件内容示例:

1 session:1234 start
2 session:2345 start
3 session:3456 start
4 session:1234 stop
5 session:7890 start
6 session:4567 start
7 session:2345 stop
8 session:4567 stop

您可以使用:

  • 活动会话的字典,包含开始日期和会话id作为键
  • 一种字典,其中包含每个会话的持续时间列表,会话id为键

然后我将处理按时间排序的输入文件:

  • 找到开始行后,将开始时间放入活动会话词汇表中。如果其中一个已经存在,那么它将是一个未终止的会话(停止线丢失),应该被忽略
  • 找到停止行后,在活动会话字典中搜索相应的开始时间。如果没有找到,只需忽略停止线而不启动。否则,计算会话持续时间并将其添加到该会话的列表中,然后从活动会话词汇表中移除该元素。你知道吗

我将使用defaultdict(list)作为durations来简单地添加duration,而不必怀疑该会话的列表是否已经存在。你知道吗

相关问题 更多 >