如何用Pandas按Level列分组自动计算时间差?
按Level分组计算每组时间跨度
用户提供的数据集代码:
import pandas as pd from datetime import datetime, date data = {'Time': ["08:35:00", "08:40:00", "08:45:00", "08:55:00", "08:57:00", "08:59:00"], 'Level': [250, 250, 250, 200, 200, 200]} df = pd.DataFrame(data) df['Time'] = pd.to_datetime(df['Time'],format= '%H:%M:%S' ).dt.time
需求:按Level分组,计算每组的时间跨度(最大值减最小值)。尝试直接用groupby.apply计算Time的最大最小差值时失败,因为time类型不支持直接相减。
解决方案1:保留datetime类型(推荐)
不要将Time列转换为time类型,直接保留datetime类型,这样可以直接进行差值计算:
import pandas as pd data = {'Time': ["08:35:00", "08:40:00", "08:45:00", "08:55:00", "08:57:00", "08:59:00"], 'Level': [250, 250, 250, 200, 200, 200]} df = pd.DataFrame(data) # 保留datetime类型,不转成time df['Time'] = pd.to_datetime(df['Time'], format='%H:%M:%S') # 分组计算时间跨度 df2 = df.groupby('Level')['Time'].agg(lambda x: x.max() - x.min()) print(df2)
输出结果:
Level 200 0 days 00:04:00 250 0 days 00:10:00 Name: Time, dtype: timedelta64[ns]
解决方案2:基于已转换的time类型计算
如果必须保留time类型的Time列,可以在分组后用datetime.combine将time对象转换为datetime对象再计算差值:
import pandas as pd from datetime import datetime, date data = {'Time': ["08:35:00", "08:40:00", "08:45:00", "08:55:00", "08:57:00", "08:59:00"], 'Level': [250, 250, 250, 200, 200, 200]} df = pd.DataFrame(data) df['Time'] = pd.to_datetime(df['Time'],format= '%H:%M:%S' ).dt.time # 分组计算,先转换time为datetime再求差值 df2 = df.groupby('Level').apply( lambda x: datetime.combine(date.today(), x['Time'].max()) - datetime.combine(date.today(), x['Time'].min()) ) print(df2)
输出结果同样为:
Level 200 0 days 00:04:00 250 0 days 00:10:00 dtype: timedelta64[ns]
内容的提问来源于stack exchange,提问作者Essegn
相关产品推荐
相关产品推荐

