首页 > 解决方案 > 使用 datetime pandas 根据持续时间创建行

问题描述

我面临使用日期时间编写代码的问题。我已经创建了一个我正在处理的场景。有人可以帮我解决代码。

输入:

Name, Channel, Duration, Start_time
John, A, 2, 16:00:00
Joseph, B, 3, 15:05:00

输出:

Name, Channel, Duration, Start_time
John, A, 2, 16:00:00
John, A, 2, 16:01:00
Joseph, B, 3, 15:05:00
Joseph, B, 3, 15:06:00
Joseph, B, 3, 15:07:00

先感谢您。

在此处输入图像描述

标签: pythonpandasdatetimetimedelta

解决方案


采用:

df['Start_time'] = pd.to_timedelta(df['Start_time'])
df = df.loc[df.index.repeat(df['Duration'])]
td = pd.to_timedelta(df.groupby(level=0).cumcount() * 60, unit='s')

df['Start_time'] = df['Start_time'] + td
df = df.reset_index(drop=True)

print (df)
     Name Channel  Duration Start_time
0    John       A         2   16:00:00
1    John       A         2   16:01:00
2  Joseph       B         3   15:05:00
3  Joseph       B         3   15:06:00
4  Joseph       B         3   15:07:00

说明

  1. 首次转换列Start_time to_timedelta
  2. 然后repeat按列索引值Duration并按重复行loc
  3. 按每个索引值创建计数器cumcount并将其转换为 1 分钟时间增量,这些时间增量将添加到新的重复列中Start_time
  4. 最后reset_index带有参数drop=True以避免重复的索引值

编辑:

如果希望输出解决方案中的日期时间相同,则只需先转换值to_datetime

df['Start_time'] = pd.to_datetime(df['Start_time'])
df = df.loc[df.index.repeat(df['Duration'])]
td = pd.to_timedelta(df.groupby(level=0).cumcount() * 60, unit='s')

df['Start_time'] = df['Start_time'] + td
df = df.reset_index(drop=True)
print (df)
     Name Channel  Duration          Start_time
0    John       A         2 2018-11-19 16:00:00
1    John       A         2 2018-11-19 16:01:00
2  Joseph       B         3 2018-11-19 15:05:00
3  Joseph       B         3 2018-11-19 15:06:00
4  Joseph       B         3 2018-11-19 15:07:00

推荐阅读