如何拆分 Pandas DataFrame 中包含超过一个月的两个时间戳之间的差异

懒惰评估

我有一个类似于这个的 DataFrame,它描述了看板(容器)的旅行开始和结束时间戳,其中包含在车间移动的组件/零件:

df = pd.DataFrame({
    'id_kanban': [244, 243, 8, 9, 29],
    'component': ['A', 'A', 'B', 'B', 'C'],
    'start': ['2021-01-23 11:51:39', '2021-01-28 08:11:48', '2021-01-30 06:32:32',
              '2021-02-01 11:21:39', '2021-02-02 17:03:18'],
    'end': ['2021-02-11 10:20:21', '2021-01-28 09:13:42', '2021-02-02 08:14:24',
            '2021-04-04 09:22:19', '2021-02-03 13:05:28']
})

输出:

    id_kanban   component   start                 end
0   244         A           2021-01-23 11:51:39   2021-02-11 10:20:21
1   243         A           2021-01-28 08:11:48   2021-01-28 09:13:42
2   8           B           2021-01-30 06:32:32   2021-02-02 08:14:24
3   9           B           2021-02-01 11:21:39   2021-04-04 09:22:19
4   29          C           2021-02-02 17:03:18   2021-02-03 13:05:28

因此,在此示例中,看板 244 从 1 月 23 日 11:51:39 到 2 月 11 日 10:20:21 在车间内移动。

我想计算每个看板的旅行时间,但要分几个月。因此,对于看板 244,我想在 1 月和 2 月之间拆分计算,即计算从 1 月 23 日到 2 月 1 日的旅行时间,然后从 2 月 1 日到 2 月 11 日。

我的想法是在月份之间拆分时间戳,并在每次发生变化时创建一个新行(包括可能在两个时间戳之间的月份,例如看板 9,其中看板在整个 2 月、3 月和 4 月都行进过)。

这是我正在考虑的输出示例:

    id_kanban   component   start                 end
0   244         A           2021-01-23 11:51:39   2021-02-01 00:00:00
1   244         A           2021-02-01 00:00:00   2021-02-11 10:20:21
2   243         A           2021-01-28 08:11:48   2021-01-28 09:13:42
3   8           B           2021-01-30 06:32:32   2021-02-01 00:00:00
4   8           B           2021-02-01 00:00:00   2021-02-02 08:14:24
5   9           B           2021-02-01 11:21:39   2021-03-01 00:00:00
6   9           B           2021-03-01 00:00:00   2021-04-01 00:00:00
7   9           B           2021-04-01 00:00:00   2021-04-04 09:22:19
8   29          C           2021-02-02 17:03:18   2021-02-03 13:05:28

我想尽可能多地利用 Pandas 的矢量化,而不是自定义函数,因为数据集很大,因此可以迭代地应用于每一行。

关于如何从第一个输出到第二个输出的任何想法?

科拉连

您可以使用一个月的频率构建新的DateTimeIndexdate_range然后返回间隔:

def find_interval(sr):
    dti = pd.date_range(sr['start'], sr['end'], freq='M').normalize() \
              + pd.Timedelta(days=1)
    return list(zip([sr['start']] + dti.tolist(), dti.tolist() + [sr['end']]))

df1 = df.apply(find_interval, axis=1).explode().apply(pd.Series)
df1 = df.drop(columns=['start', 'end']) \
        .join(df1).rename(columns={0: 'start', 1: 'end'})

输出

>>> df1
   id_kanban component               start                 end
0        244         A 2021-01-23 11:51:39 2021-02-01 00:00:00
0        244         A 2021-02-01 00:00:00 2021-02-11 10:20:21
1        243         A 2021-01-28 08:11:48 2021-01-28 09:13:42
2          8         B 2021-01-30 06:32:32 2021-02-01 00:00:00
2          8         B 2021-02-01 00:00:00 2021-02-02 08:14:24
3          9         B 2021-02-01 11:21:39 2021-03-01 00:00:00
3          9         B 2021-03-01 00:00:00 2021-04-01 00:00:00
3          9         B 2021-04-01 00:00:00 2021-04-04 09:22:19
4         29         C 2021-02-02 17:03:18 2021-02-03 13:05:28

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Pandas从DataFrame拆分列

如何比较两个DataFrame之间的Pandas列的值

您如何确定组中与另一个日期最接近的日期而不在两个Pandas DataFrame之间切换?

如何获取Pandas DataFrame的最近5个月的数据?

如何在 Pandas DataFrame 中融合两个索引以在 Python 中只创建一个

如何将Pandas Series拆分成一个每天有小时的带有列的DataFrame?

如何在 Pandas 中减去两个 DataFrame 列

拆分一个Pandas DataFrame,其中一个因子列在拆分之间均匀分布

如何将一行中的字典列表拆分为多行 Pandas DataFrame?

如何在Python Pandas中的两个值之间选择DataFrame中的行?

如何在Python Pandas中获得上一年最后一个月的最后一个工作周?

在单元格中的第一个字母之后将pandas dataframe列拆分为两个

Pandas Dataframe:如何将一列拆分为多个一键编码的列

如何查找Excel中两个日期之间一个月的第n天经过了多少次?

在Pandas DataFrame中拆分列表

在Pandas DataFrame中拆分列列表

在Python中拆分和排序Pandas DataFrame

在Pandas DataFrame中拆分文本列表

无法在 Pandas Dataframe 中拆分列

Python Pandas DataFrame拆分

如何从Pandas DataFrame列中减去一个值

计算两个Pandas DataFrame中列之间的分数差异

如何按索引顺序拆分pandas.DataFrame?

如何使用Apply将Pandas DataFrame列拆分为多个?

替换 Pandas 中两个 DataFrame 之间的文本

如何计算两个Pandas DataFrame列之间的Levenshtein距离?

如何计算Pandas DataFrame中行之间的差异?

如何将可变大小的基于字符串的列拆分为Pandas DataFrame中的多个列?

如何基于Pandas中的另一个DataFrame更改DataFrame的某些列中的值