【问题标题】:Sum of duration between each rows with regards to 2 field in PYTHON关于 PYTHON 中 2 个字段的每行之间的持续时间总和
【发布时间】:2018-07-18 03:59:05
【问题描述】:

我有一组关于时间戳、模型和模式的数据 该模式有 4 种不同的模式,表示为 (0,2,4,8)

Index  Model Timestamp              Mode
1      x  2016-06-26 09:51:24.279   0
2      x  2016-06-26 09:51:26.282   0
3      x  2016-06-26 09:51:28.279   0
4      x  2016-06-26 09:51:30.279   0
5      y  2016-06-26 09:51:32.279   2
6      y  2016-06-26 09:51:34.279   2
7      x  2016-06-26 09:51:36.278   2
8      x  2016-06-26 09:51:38.279   0
9      x  2016-06-26 09:51:40.279   0
10     y  2016-06-26 09:51:42.280   0
11     x  2016-06-26 09:51:44.279   2
12     x  2016-06-26 09:51:46.279   0
13     x  2016-06-26 09:51:48.279   2
14     x  2016-06-26 09:51:50.281   0
15     y  2016-06-26 09:51:52.279   2
16     y  2016-06-26 09:51:54.279   2
17     x  2016-06-26 09:51:56.281   0
18     x  2016-06-26 09:51:58.279   0
19     x  2016-06-26 09:52:00.279   0

我会想在他们的模式(映射到模型)中寻找时差。因此,如果它从模式 0 过渡到模式 2,则在第一个模式 2 应该计算 0,它应该计算持续时间差异,如下所示

Index  Model Timestamp              Mode  Diff
1      x  2016-06-26 09:51:24.279   0     0
2      x  2016-06-26 09:51:26.282   0     2.002
3      x  2016-06-26 09:51:28.279   0     1.998
4      x  2016-06-26 09:51:30.279   0     2
5      y  2016-06-26 09:51:32.279   2     0
6      y  2016-06-26 09:51:34.279   2     2
7      x  2016-06-26 09:51:36.278   2     0
8      x  2016-06-26 09:51:38.279   0     0
9      x  2016-06-26 09:51:40.279   0     2
10     y  2016-06-26 09:51:42.280   0     0
11     x  2016-06-26 09:51:44.279   2     0
12     x  2016-06-26 09:51:46.279   0     0
13     x  2016-06-26 09:51:48.279   2     0
14     x  2016-06-26 09:51:50.281   0     0
15     y  2016-06-26 09:51:52.279   2     0
16     y  2016-06-26 09:51:54.279   2     2
17     x  2016-06-26 09:51:56.281   0     6
18     x  2016-06-26 09:51:58.279   0     1.998
19     x  2016-06-26 09:52:00.279   0     2

到目前为止,我在 mode 中进行了排序(分组时间和模式),然后找到正确的差异。过境时我无法获得 0。

请指教!

tdm = mydataset.groupby(["Model","Drive Mode"])["timestamp"]
mydataset["DM-Diff"] = tdm.diff().fillna(0) / pd.datetools.timedelta(seconds = 1)
mydataset = mydataset[mydataset["DM-Diff"] < 180]
mydataset = mydataset[mydataset["DM-Diff"] > -1]#hardcoding with range so that it will not include other mode value

【问题讨论】:

    标签: python pandas dataframe duration


    【解决方案1】:

    你可以使用

    In [42]: breaks = df['Mode'].ne(df['Mode'].shift()).cumsum()
    
    In [43]: (df.groupby(breaks)['Timestamp'].diff() / np.timedelta64(1, 's')).fillna(0)
    Out[43]:
    0     0.000
    1     2.003
    2     1.997
    3     2.000
    4     0.000
    5     2.000
    6     1.999
    7     0.000
    8     2.000
    9     2.001
    10    0.000
    11    0.000
    12    0.000
    13    0.000
    14    0.000
    15    2.000
    16    0.000
    17    1.998
    18    2.000
    Name: Timestamp, dtype: float64
    

    详情

    In [44]: breaks
    Out[44]:
    0     1
    1     1
    2     1
    3     1
    4     2
    5     2
    6     2
    7     3
    8     3
    9     3
    10    4
    11    5
    12    6
    13    7
    14    8
    15    8
    16    9
    17    9
    18    9
    Name: Mode, dtype: int32
    

    【讨论】:

    • 嗨!谢谢你的回答,我可以和你核实一下“breaks = df['Mode'].ne(df['Mode'].shift()).cumsum()”。这条线实际上是什么意思?
    • 嗨@Zero 不要介意我,我已经更新了问题。一定要看看,谢谢你的回复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多