【问题标题】:Drop timestamps when starting/looping again再次开始/循环时删除时间戳
【发布时间】:2020-06-25 03:34:06
【问题描述】:

我有一个包含时间序列值的df。时间戳贯穿到某个点,然后重新开始。因为这个终点可能会有所不同,所以我必须手动找到终点,然后子集所需的输出。

我希望找到一个更自动化的功能来做到这一点。使用下面的df,时间序列从2020-04-13 19:25:34.1 开始,到2020-04-13 19:45:34.1 结束。所以大约20分钟。然后时间序列在 2020-04-13 19:25:34 标记附近重新开始(可能不是精确到 0.1 秒)。

作为参考,我的数据集的时间序列将扩展 30-40 分钟,然后重新开始。但第二个循环的开始可能不一定在同一时间点开始。

df1 = pd.DataFrame({   
        'Val' : [1,2,3,4,5,6,7,8,1,2],             
        'Time' : ['2020-04-13 19:25:34.1','2020-04-13 19:25:34.1','2020-04-13 19:35:34.1','2020-04-13 19:35:34.1','2020-04-13 19:45:34.1','2020-04-13 19:45:34.1','2020-04-13 19:25:34.3','2020-04-13 19:25:34.3','2020-04-13 19:35:34.1','2020-04-13 19:35:34.1'],                 
    }) 

# Return first set of timestamps manually
df1 = df1[:6]

我这样做的主要原因是因为我需要稍后执行 groupby。如果我不删除第二组时间戳,它会完全排序,这是不可取的。

Val_group = df1.groupby(['Time'])['Val'].apply(list)

Time
2020-04-13 19:25:34.1          [1, 2]
2020-04-13 19:25:34.3          [7, 8]
2020-04-13 19:35:34.1    [3, 4, 1, 2]
2020-04-13 19:45:34.1          [5, 6]

这么说,我认为如果我最初过滤第一组时间点会导致更少的问题,因为我必须调整很多后端代码。那么除了手动设置子集,有没有更有效的方法来过滤第一组时间点?

【问题讨论】:

    标签: python pandas subset


    【解决方案1】:

    首先,使用允许数学的datetime64[ns] dtype。然后形成组检查与下一行的差异为负的位置。使用创建的 'grp' 指标,您应该能够选择您想要的任何组 (df1[df1['grp'] == 1]),或者您现在可以在以后的 groupby 操作中将其用作分组。

    df1['Time'] = pd.to_datetime(df1['Time'])
    df1['grp'] = df1['Time'].diff().dt.total_seconds().lt(0).cumsum()
    

    print(df1)
       Val                    Time  grp
    0    1 2020-04-13 19:25:34.100    0
    1    2 2020-04-13 19:25:34.100    0
    2    3 2020-04-13 19:35:34.100    0
    3    4 2020-04-13 19:35:34.100    0
    4    5 2020-04-13 19:45:34.100    0
    5    6 2020-04-13 19:45:34.100    0
    6    7 2020-04-13 19:25:34.300    1
    7    8 2020-04-13 19:25:34.300    1
    8    1 2020-04-13 19:35:34.100    1
    9    2 2020-04-13 19:35:34.100    1
    

    【讨论】:

    • 感谢 ALollz,我的 groupby 方法有点不同。其中有几个,所以我认为返回第一个时间序列的第一个选择是理想的。
    【解决方案2】:

    按分钟、秒和微秒分组和聚合。这样您就不必过滤掉它。如果您还需要时间,请添加 df1['Time'].dt.hour

    df1['Time'] = pd.to_datetime(df1['Time'])
    df1.groupby([df1['Time'].dt.minute,df1['Time'].dt.second,df1['Time'].dt.microsecond]).count()
    
                 Val    Time
    Time Time Time      
    25  34  100000  2   2
            300000  2   2
    35  34  100000  4   4
    45  34  100000  2   2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多