如何识别具有重叠周期的时间序列数据中的周期?

如何解决如何识别具有重叠周期的时间序列数据中的周期?

给定具有 4 个任务类别(A、B、C、D)及其相应时间戳的时间序列数据,我的任务是确定 [(A,B,C,D)_1,(A,D)_2,...]

这将很简单(例如,哈希映射或链表),具有干净、不重叠的事件,但我的数据包含序列(按时间排序),例如 [A,A,D,D]。举个例子:

事件 时间
任务 A 11/1/16 3:57
任务 B 11/1/16 4:19
任务 A 11/1/16 7:43
任务 B 11/1/16 7:43
任务 C 11/1/16 7:51
任务 D 11/1/16 7:51
任务 C 11/1/16 8:11
任务 D 11/1/16 8:13
任务 A 11/3/16 3:49
任务 B 16 年 11 月 3 日 4:11
任务 B 11/3/16 7:34
任务 A 11/3/16 7:34
任务 C 11/3/16 7:43
任务 D 11/3/16 7:43
任务 C 11/3/16 8:03
任务 D 11/3/16 8:05
任务 A 11/5/16 3:41
任务 B 11/5/16 4:03
任务 A 11/5/16 7:26
任务 B 11/5/16 7:26
任务 D 11/5/16 7:35
任务 C 11/5/16 7:35
任务 C 11/5/16 7:54
任务 D 11/5/16 7:56

在这种情况下,正确的答案是一旦任务 A(循环的开始)已经开始,就删除“内部”/重叠的 ABCD。这导致 3 个时期:

任务 A 任务 B 任务 C 任务 D
11/1/16 3:57 11/1/16 4:19 11/1/16 8:11 11/1/16 8:13
11/3/16 3:49 16 年 11 月 3 日 4:11 11/3/16 8:03 11/3/16 8:05
11/5/16 3:41 11/5/16 4:03 11/5/16 7:54 11/5/16 7:56

忽略(暂时)边缘情况,例如不完整的事件序列,是否有一种有效的算法来识别周期,同时合并重叠的内部周期?

解决方法

只是@user3386109 提到的方法并跟踪事件时间戳。

将输入移动到名为 events.txt 的文件中。

file = open("events.txt","r")
result = []
partial_result = {}
max_count =0;
tasks_count = [0,0]
for event in file:
    event = event.strip('\n')
    split_events = event.split()
    max_count = max(tasks_count)
    if len(split_events)==4: #Task data
        task_name = split_events[1]
        time =  split_events[2]+" "+split_events[3]
        idx = ord(task_name)-65
        curr_count = tasks_count[idx]
        if (curr_count==max_count or curr_count+1 == max_count) and task_name not in partial_result:
            partial_result[task_name] = time
        tasks_count[idx] +=1

    if len(partial_result)==4:
        result.append(partial_result)
        partial_result ={}
        tasks_count = [0,0]

print(result)

最终结果

[{'A': '11/1/16 3:57','B': '11/1/16 4:19','C': '11/1/16 8:11','D': '11/1/16 8:13'},{'A': '11/3/16 3:49','B': '11/3/16 4:11','C': '11/3/16 8:03','D': '11/3/16 8:05'},{'A': '11/5/16 3:41','B': '11/5/16 4:03','C': '11/5/16 7:54','D': '11/5/16 7:56'}]
,

您可以使用collections.defaultdict

import collections,datetime,re
r,d = [],collections.defaultdict(list)
data = [['Task A','11/1/16 3:57'],['Task B','11/1/16 4:19'],['Task A','11/1/16 7:43'],['Task C','11/1/16 7:51'],['Task D','11/1/16 8:11'],'11/1/16 8:13'],'11/3/16 3:49'],'11/3/16 4:11'],'11/3/16 7:34'],'11/3/16 7:43'],'11/3/16 8:03'],'11/3/16 8:05'],'11/5/16 3:41'],'11/5/16 4:03'],'11/5/16 7:26'],'11/5/16 7:35'],'11/5/16 7:54'],'11/5/16 7:56']]
for a,b in data: 
   v = list(map(int,re.findall('\d+',b)))
   _date = datetime.datetime(v[2],v[0],v[1],v[-2],v[-1],0)
   if (k:=a.split()[-1]) == 'A' and all(j in d for j in ['A','B','C','D']):
       r.append(d)
       d = collections.defaultdict(list)
       d[k].append(_date)
   else:
       d[k].append(_date)

r.append(d)

f,f1 = {'A':min,'B':min,'C':max,'D':max},lambda x:f'{x.month}/{x.day}/{x.year} {x.hour}:{str(x.minute).zfill(2)}'
result = [{a:f1(f[a](b)) for a,b in i.items()} for i in r]

输出:

[{'A': '11/1/16 3:57','D': '11/5/16 7:56'}]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?