代码之家  ›  专栏  ›  技术社区  ›  Gtoth

如何分割Pandas DataFrame中包含多个日期的两个时间戳之间的差异

  •  0
  • Gtoth  · 技术社区  · 1 年前

    我有一个DataFrame,它包含压缩机不运行(停机)的开始和结束日期。有些项目从一天开始,一直持续到第二天。我想把这些行分开,这样我们就可以每天对数据进行分解。

    下面是我的数据集的一个小示例大小。第二个条目有不同日期的开始时间和结束时间

    这是我的输入代码:

    df = pd.DataFrame({
        'Compressor #': [0, 0, 0, 0],
        'start': ['2023-04-13 14:35:00', '2023-04-13 23:40:00', '2023-04-14 07:50:00',
                  '2023-04-19 07:32:39'],
        'end': ['2023-04-13 16:05:00', '2023-04-14 02:00:00', '2023-04-14 10:45:00',
                  '2023-04-19 08:41:08']
    })
    

    这是我的输入数据帧:

           Compressor #                start                  end
    0             0  2023-04-13 14:35:00  2023-04-13 16:05:00
    1             0  2023-04-13 23:40:00  2023-04-14 02:00:00
    2             0  2023-04-14 07:50:00  2023-04-14 10:45:00
    3             0  2023-04-19 07:32:39  2023-04-19 08:41:08
    

    我发现了以前的一篇类似的帖子,但是按月发布的( How can I split the difference between two timestamps that contain more than one month in a Pandas DataFrame )

    我试图在这里编辑解决方案,这就是我想到的:(它不起作用)

    def find_interval(sr):
        dti = pd.date_range(sr['Start time'], sr['End time'], freq='D').normalize() \
                  + pd.Timedelta(days=1)
        return list(zip([sr['Start time']] + dti.tolist(), dti.tolist() + [sr['End time']]))
    
    df2 = df.apply(find_interval, axis=1).explode().apply(pd.Series)
    df2 = df.drop(columns=['Start time', 'End time']) \
            .join(df2).rename(columns={0: 'Start time', 1: 'End time'})
    

    以下是我想要的输出: Output:

    1 回复  |  直到 1 年前
        1
  •  0
  •   Panda Kim    1 年前

    我已经修改了你链接的帖子中的代码,以满足你的需求。

    我认为开始列和结束列的类型为datetime是合适的,所以我转换了数据类型,然后应用了代码。

    def find_interval(sr):
        dti = pd.date_range(str(sr['start']).split(' ')[0], str(sr['end']).split(' ')[0])    
        dti = dti[(dti > sr['start']) & (dti < sr['end'])].tolist()
        return list(zip([sr['start']] + dti, dti + [sr['end']]))
    
    
    df['start'] = pd.to_datetime(df['start'])
    df['end'] = pd.to_datetime(df['end'])  
    out = df.apply(find_interval, axis=1).explode().apply(pd.Series, index=['start', 'end'])
    out = df.drop(columns=['start', 'end']).join(out)
    

    出来

    Compressor #    start   end
    0   0   2023-04-13 14:35:00 2023-04-13 16:05:00
    1   0   2023-04-13 23:40:00 2023-04-14 00:00:00
    1   0   2023-04-14 00:00:00 2023-04-14 02:00:00
    2   0   2023-04-14 07:50:00 2023-04-14 10:45:00
    3   0   2023-04-19 07:32:39 2023-04-19 08:41:08