基于条件在Python Pandas中向数据框添加新行

3
需要根据条件向数据框中添加新行。
当前的数据框:

enter image description here

在这个数据框中有4列。我想要做的是检查“Time”列,并检查每个晚班中午12点最近的值,然后添加两行新行,分别为11:59:59和00:00:01,与最接近的数据点具有相同的值。
例如:03-01夜班最接近12PM的值是21:46:54。因此需要添加两行。
W25     03-01 Night    RUNNING    23:59:59
W25     03-01 Night    RUNNING    00:00:01

最终预期的数据框应该是这样的:

enter image description here

样例数据:
data={'Machine': {0: 'W5', 343: 'W5', 344: 'W5', 586: 'W5', 587: 'W5'}, 'State': {0: 'start', 343: 'STOPPED', 344: 'RUNNING', 586: 'STOPPED', 587: 'MAINT'}, 'Day-Shift': {0: '03-01 Night', 343: '03-01 Night', 344: '03-01 Night', 586: '03-01 Night', 587: '03-01 Night'}, 'Time': {0: Timestamp('2021-03-01 21:00:00'), 343: Timestamp('2021-03-01 22:16:54'), 344: Timestamp('2021-03-01 23:16:54'), 586: Timestamp('2021-03-01 23:48:45'), 587: Timestamp('2021-03-02 02:28:54')}}

非常感谢您的支持!!!!

1
你有一个完整的日期时间对象可以使用吗?我看到你的列中缺少年份。此外,如果你有正确格式化的日期时间对象,夜晚/白天是多余的。 - undefined
@Manakin 你有没有办法解决这个问题? - undefined
1个回答

1
你可以使用idxmax()来查找每天的最大记录,然后创建一个日期时间对象。
df1 = df.loc[df.groupby([df['Time'].dt.normalize()])['Time'].idxmax()]
df1 = pd.concat([df1] * 2)

df1['Time'] = pd.to_datetime((df1['Time'].dt.normalize().astype(str) + [' 23:59:59', ' 00:00:01']))

print(df1)

    Machine  State  Day-Shift                Time
587     W25  MAINT  03-01 Day 2021-03-01 23:59:59
587     W25  MAINT  03-01 Day 2021-03-01 00:00:01

df = pd.concat([df,df1]).sort_index().reset_index(drop=True)


  Machine    State  Day-Shift                Time
0     W25    start  03-01 Day 2021-03-01 07:00:00
1     W25  STOPPED  03-01 Day 2021-03-01 07:16:54
2     W25  RUNNING  03-01 Day 2021-03-01 07:16:54
3     W25  STOPPED  03-01 Day 2021-03-01 07:28:45
4     W25    MAINT  03-01 Day 2021-03-01 07:28:54
5     W25    MAINT  03-01 Day 2021-03-01 23:59:59
6     W25    MAINT  03-01 Day 2021-03-01 00:00:01

非常感谢。但是这给了我一个错误。ValueError: 无法将形状为(4,)和(2,)的操作数进行广播。 - undefined
1
@domahc 不是最优雅的写法,但是尝试一下 df1 = pd.concat([ y.assign(Time=pd.to_datetime((y['Time'].dt.normalize().astype(str) + [' 23:59:59', ' 00:00:01'])) ) for x,y in df1.groupby(df1['Time'].dt.day) ]) - undefined
df1返回了4行,但应该是2行,就像你答案中的df1一样。 - undefined
@domahc 你只想要最大的日期时间吗?因为你的数据集中有不同的日期。 - undefined
@domahc 我试过了,它有效果(我上面发布的代码片段) - undefined
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接