计算时间序列数据帧中事件的持续时间(python 2.7)

时间:2013-11-14 13:39:05

标签: python events time-series duration dataframe

我有一个相当大的熊猫数据框,这是一个时间序列,每个时间戳(眼动追踪数据)都有很多不同的信息。

部分数据看起来有点像:

In [58]: df
Out[58]:
    time    event
49  44295   NaN
50  44311   NaN
51  44328   NaN
52  44345   2
53  44361   2
54  44378   2
55  44395   2
56  44411   2
57  44428   3
58  44445   3
59  44461   3
60  44478   3 
61  44495   NaN
62  44511   NaN
63  44528   NaN
64  44544   NaN  
65  44561   NaN
66  44578   NaN
67  44594   NaN
68  44611   4
69  44628   4
70  44644   4
71  44661   NaN
72  44678   NaN

我想计算每个事件的(时间)持续时间,作为给定事件的最大(时间)-min(时间),例如活动2:44411-44345 = 66

这个持续时间我想在一个新列中,以便数据最终结束:

In [60]: df
Out[60]:
    time    event    duration
49  44295   NaN      NaN
50  44311   NaN      NaN
51  44328   NaN      NaN
52  44345   2        66
53  44361   2        66
54  44378   2        66
55  44395   2        66
56  44411   2        66
57  44428   3        50
58  44445   3        50
59  44461   3        50
60  44478   3        50
61  44495   NaN      NaN
62  44511   NaN      NaN
63  44528   NaN      NaN
64  44544   NaN      NaN
65  44561   NaN      NaN
66  44578   NaN      NaN
67  44594   NaN      NaN
68  44611   4        33
69  44628   4        33
70  44644   4        33
71  44661   NaN      NaN
72  44678   NaN      NaN

我该怎么做?

3 个答案:

答案 0 :(得分:0)

使用groupby中的itertools对记录进行迭代。组标准应为事件编号。由于您已正确排序数据(与同一事件相关的所有事件代码不会被其他事件中断),因此无需对偶数代码进行排序。

groupby将迭代返回元组(键,组),其中键是偶数代码,组是所有记录的列表。

从记录中,选择最小和最大时间并计算持续时间。

然后,做你的工作,将持续时间作为记录的新字段。

使用pandas可能有更有效的方法,我不知道。所描述的解决方案不需要大熊猫。

答案 1 :(得分:0)

一种方法是使用groupbytransformmax - min也称为peak-to-peak,简称ptp,因此ptp基本上代表lambda x: x.max() - x.min()

>>> df = pd.read_csv("eye.csv",sep="\s+")
>>> df["duration"] = df.dropna().groupby("event")["time"].transform("ptp")
>>> df
     time  event  duration
49  44295    NaN       NaN
50  44311    NaN       NaN
51  44328    NaN       NaN
52  44345      2        66
53  44361      2        66
54  44378      2        66
55  44395      2        66
56  44411      2        66
57  44428      3        50
58  44445      3        50
59  44461      3        50
60  44478      3        50
61  44495    NaN       NaN
62  44511    NaN       NaN
63  44528    NaN       NaN
64  44544    NaN       NaN
65  44561    NaN       NaN
66  44578    NaN       NaN
67  44594    NaN       NaN
68  44611      4        33
69  44628      4        33
70  44644      4        33
71  44661    NaN       NaN
72  44678    NaN       NaN

dropna旨在防止将NaN列中的每个event值视为自己的事件。 (当密钥为ptp时,NaN的工作方式也有些奇怪,但这是一个单独的问题。)

答案 2 :(得分:0)

我最终对@DSM发布的答案做了以下工作:

df["dur"] = datalist[i][j].groupby("event")["time"].transform("ptp")
dur = []
for i in datalist.index:
    if np.isnan(df["event"][i]): 
        dur.append(df["event"][i])
    else:
        dur.append(df["dur"][i])
df["Duration"] = dur

这至少对我有用。