我有一个类似于这个的 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 的矢量化,而不是自定义函数,因为数据集很大,因此可以迭代地应用于每一行。
关于如何从第一个输出到第二个输出的任何想法?
您可以使用一个月的频率构建新的DateTimeIndex
,date_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] 删除。
我来说两句