看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本例,我们利用 pandas 将连续持续时间列转换为开始和结束列,对于一个数据如果只知道它的持续时间,同时这个持续时间是连续的,我们如何填充两个列,来表示这个持续时间对应的开始时间的结束时间。
构造数据如下:
import pandas as pd
data = [
['A', 7],
['B', 5],
['C', 5],
['D', 15],
['E', 5]
]
df = pd.DataFrame(data, columns=['name', 'duration'])
df
'''
name duration
0 A 7
1 B 5
2 C 5
3 D 15
4 E 5
'''
duration 是持续时间,是一个时长,我们现在需要增加一个开始时间和结束时间,结束时间为从开始时间加持续时间,下行的开始时间为上行的结束时间。
即最终结果为:
'''
name start duration end
0 A 0 7 7
1 B 7 5 12
2 C 12 5 17
3 D 17 15 32
4 E 32 5 37
'''
根据需求,我们认为第一个开始时间是 0,我们先增加结束时间,结束时间就是结束时间累加值,然后再通过结束时间减去持续时间就得到了开始时间。
最后再按要求重新调整列的顺序,就完成了需求。
先计算结束时间:
df.assign(end=df.duration.cumsum())
'''
name duration end
0 A 7 7
1 B 5 12
2 C 5 17
3 D 15 32
4 E 5 37
'''
再计算开始时间,由结束时间与持续时间相减而来:
(
df.assign(end=df.duration.cumsum())
.eval('start=end-duration')
)
'''
name duration end start
0 A 7 7 0
1 B 5 12 7
2 C 5 17 12
3 D 15 32 17
4 E 5 37 32
'''
最后再调整列的顺序,就得到了最后的结果:
(
df.assign(end=df.duration.cumsum())
.eval('start=end-duration')
.reindex(['name', 'start', 'duration', 'end'], axis=1)
)
'''
name start duration end
0 A 0 7 7
1 B 7 5 12
2 C 12 5 17
3 D 17 15 32
4 E 32 5 37
'''
这样就完成了这个需求。
(完)
更新时间:2024-08-18 16:23:12 标签:pandas python 持续时间 转换