【问题标题】:Subtracting datetime value from previous row in pandas dataframe从熊猫数据框中的前一行中减去日期时间值
【发布时间】:2018-08-06 11:44:25
【问题描述】:

我有一个包含两列的数据框:CategoryDatetime

我想创建一个新列来显示当前行与上一行的日期时间之间的差异,在每个类别重新开始

我有什么:

Category    Datetime
A           2018-02-01 01:51:04
A           2018-02-01 02:04:04
B           2018-02-01 02:28:34 
B           2018-02-01 02:41:34
B           2018-02-01 02:45:34    

我想要什么:

Category    Datetime               Difference
A           2018-02-01 01:51:04    NaT
A           2018-02-01 02:04:04    00:13:00
B           2018-02-01 02:28:34    NaT
B           2018-02-01 02:41:34    00:13:00
B           2018-02-01 02:45:34    00:04:00

编辑:

@sacul 我尝试了你的解决方案 df['Difference'] = list(by_group.apply(lambda x: x['Datetime']-x['Datetime'].shift())),但它给了我奇怪的结果......这是我正在使用的实际数据:

Category    Datetime        Difference
A           2/1/18 1:51     NaT
A           2/1/18 2:04     1 days 02:52:00
B           2/1/18 2:28     NaT
C           2/1/18 2:41     NaT
D           2/1/18 6:31     0 days 00:10:30
E           2/1/18 8:26     3 days 23:19:30
F           2/1/18 10:03    0 days 00:21:00
G           2/1/18 11:11    NaT
G           2/1/18 11:11    NaT
G           2/1/18 11:11    0 days 00:00:02
G           2/1/18 11:11    0 days 00:02:30
H           2/1/18 11:12    0 days 00:00:02
H           2/1/18 11:22    0 days 00:02:28
I           2/1/18 15:26    0 days 00:00:02
I           2/1/18 16:01    0 days 00:08:26
I           2/1/18 17:26    0 days 00:00:01
J           2/1/18 17:42    0 days 00:01:31
J           2/1/18 17:42    NaT

【问题讨论】:

    标签: python dataframe group-by shift subtraction


    【解决方案1】:

    替代解决方案

    import pandas as pd
    import numpy as np
    df.DateTime = pd.to_datetime(df.DateTime)
    
    
    df['Difference'] = np.where(df.Category == df.Category.shift(), df.DateTime - df.DateTime.shift(), np.nan)
    

    注意:这仅适用于您的数据已预先排序

    【讨论】:

      【解决方案2】:

      假设您的数据位于名为 df 的数据框中:

      # In case Datetime is not a Datetime object yet (skip if it is):
      df.Datetime = pd.to_datetime(df.Datetime)
      
      by_group = df.groupby(df.Category)
      
      df['Difference'] = list(by_group.apply(lambda x: x['Datetime']-x['Datetime'].shift()))
      
      >>> df
        Category            Datetime Difference
      0        A 2018-02-01 01:51:04        NaT
      1        A 2018-02-01 02:04:04   00:13:00
      2        B 2018-02-01 02:28:34        NaT
      3        B 2018-02-01 02:41:34   00:13:00
      4        B 2018-02-01 02:45:34   00:04:00
      

      这会按类别对其进行分组,然后从每组中的下一行中减去每行中的日期时间对象。

      编辑:

      这似乎也适用于您的新数据,以2/1/18 1:51 形式的字符串Datetime 开始,并通过pd.to_datetime(df.Datetime) 进行修改:

      >>> df1
         Category            Datetime Difference
      0         A 2018-02-01 01:51:00        NaT
      1         A 2018-02-01 02:04:00   00:13:00
      2         B 2018-02-01 02:28:00        NaT
      3         C 2018-02-01 02:41:00        NaT
      4         D 2018-02-01 06:31:00        NaT
      5         E 2018-02-01 08:26:00        NaT
      6         F 2018-02-01 10:03:00        NaT
      7         G 2018-02-01 11:11:00        NaT
      8         G 2018-02-01 11:11:00   00:00:00
      9         G 2018-02-01 11:11:00   00:00:00
      10        G 2018-02-01 11:11:00   00:00:00
      11        H 2018-02-01 11:12:00        NaT
      12        H 2018-02-01 11:22:00   00:10:00
      13        I 2018-02-01 15:26:00        NaT
      14        I 2018-02-01 16:01:00   00:35:00
      15        I 2018-02-01 17:26:00   01:25:00
      16        J 2018-02-01 17:42:00        NaT
      17        J 2018-02-01 17:42:00   00:00:00
      

      【讨论】:

      • 嗨@sacul!我尝试了您的解决方案,请参阅我上面的编辑。 df.Datetime 采用日期时间格式 (df['Datetime'] - df['Datetime'].shift() 给了我我正在寻找的东西(除了它不会为每个类别重新启动),所以我猜问题在于弄清楚如何在这种情况下正确使用 groupby .
      • 这很奇怪,它似乎对我有用;我正在用你的新数据更新我的答案:
      • 我必须重新处理您的数据才能将其放入数据框中,我最终得到的是一个名为 Datetime 的列,其中 strings 格式为 2/1/18 1:51 ,然后在该列上调用pd.to_datetime(df.Datetime),通过groupby 流程,我得到了发布的结果。尝试将您的“日期时间”列更改为字符串,然后按照我发布的操作。你可以使用df['Datetime'] = df['Datetime'].to_string()
      • 我明白了,这与我的日期时间格式有关(此数据是从 Splunk 导出的)。当我执行df['Datetime'].to_string()pd.to_datetime(df['Datetime']) 时,我得到ValueError: Unknown string format。显然,to_string 命令把它变成了非常奇怪的东西(它很长,所以我将它粘贴到另一条评论中)。将手动将 df.Datetime 重新格式化为字符串并尝试解决方案。
      • '41 2018-02-01 01:51:04\n72 2018-02-01 02:04:04\n73 2018-02-01 02:28:34\n74 2018-02- 01 02:41:34\n82 2018-02-01 06:31:04\n71 2018-02-01 08:26:04\n209 2018-02-01 10:03:04\n203 2018-02-01 11 :11:04\n204 2018-02-01 11:11:04\n205 2018-02-01 11:11:05\n206 2018-02-01 11:11:06\n207 2018-02-01 11:12 :04\n208 2018-02-01 11:22:34\n202 2018-02-01 15:26:04\n201 2018-02-01 16:01:04\n58 2018-02-01 17:26:04 \n59 2018-02-01 17:42:04\n60 2018-02-01 17:42:05\n62 2018-02-01 17:42:34\n61 2018-02-01 17:42:34\n63 2018-02-01 17:50:04\n64 ...
      猜你喜欢
      • 1970-01-01
      • 2020-12-30
      • 2019-05-20
      • 1970-01-01
      • 2015-09-19
      • 1970-01-01
      • 2017-11-19
      • 1970-01-01
      相关资源
      最近更新 更多