看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
问题来自知乎,经过抽象。在下列构造的数据中,time 列是一个时间单位至少是小时的时序数据,一天当中会有很多条,现在需要找出每天的开始时间和结束时间,同时找到开始时间和结束时间对应的 h0 列数据。
构造数据如下:
import pandas as pd
import numpy as np
# 构造数据
index = pd.date_range('20201123 10:00', '20201126 10:00', freq='5h')
df = pd.DataFrame({'time':index ,
'h0': np.random.randint(0, 20, len(index))})
# 数据展示
df
'''
time h0
0 2020-11-23 10:00:00 4
1 2020-11-23 15:00:00 2
2 2020-11-23 20:00:00 17
3 2020-11-24 01:00:00 2
4 2020-11-24 06:00:00 14
5 2020-11-24 11:00:00 0
6 2020-11-24 16:00:00 11
7 2020-11-24 21:00:00 15
8 2020-11-25 02:00:00 17
9 2020-11-25 07:00:00 1
10 2020-11-25 12:00:00 10
11 2020-11-25 17:00:00 6
12 2020-11-25 22:00:00 9
13 2020-11-26 03:00:00 10
14 2020-11-26 08:00:00 12
'''
对 time 列按天进行分组,然后找到每个分组最大值和最小值,最大值就是结束时间,最小值就是开始时间。同时,对 h0 列找第一个值和最后一个值。time 列的类型需要是时间类型,否则需要转换一下。
最终代码实现如下:
# 解决方案
(
df.groupby(df.time.dt.date) # 按天分组
.agg(
start=('time', 'min'), # 最小时间为开始时间
end=('time', 'max'),
first=('h0', 'first'), # 取第一个值
last=('h0', 'last')
)
)
'''
start end first last
time
2020-11-23 2020-11-23 10:00:00 2020-11-23 20:00:00 4 17
2020-11-24 2020-11-24 01:00:00 2020-11-24 21:00:00 2 15
2020-11-25 2020-11-25 02:00:00 2020-11-25 22:00:00 17 9
2020-11-26 2020-11-26 03:00:00 2020-11-26 08:00:00 10 12
'''
以上就实现了需求。
(完)
更新时间:2024-08-18 15:28:59 标签:pandas python 时序数据