求助:计算DataFrame中温度低于100的持续时长
计算DataFrame中温度低于指定值的持续时长
需求说明
给定每15秒记录一次温度的DataFrame,需计算温度低于100的连续时间段的起始时间、结束时间及持续时长。
输入样例
ID Temperature Datetime 0 A 102 24/09/2017 7:00:00 AM 1 A 100 24/09/2017 7:00:15 AM 2 A 99 24/09/2017 7:00:30 AM 3 A 98 24/09/2017 7:00:45 AM 4 A 100 24/09/2017 7:01:00 AM 5 A 99 24/09/2017 7:01:15 AM 6 A 98 24/09/2017 7:01:30 AM 7 A 100 24/09/2017 7:01:45 AM
期望输出
ID Hour_start Hour_end Duration A 24/09/2017 7:00:30 AM 24/09/2017 7:01:00 AM 30 A 24/09/2017 7:01:15 AM 24/09/2017 7:01:45 AM 30
解决方案代码
import pandas as pd # 1. 构造/读取数据(此处用样例数据演示) data = { 'ID': ['A']*8, 'Temperature': [102, 100, 99, 98, 100, 99, 98, 100], 'Datetime': ['24/09/2017 7:00:00 AM', '24/09/2017 7:00:15 AM', '24/09/2017 7:00:30 AM', '24/09/2017 7:00:45 AM', '24/09/2017 7:01:00 AM', '24/09/2017 7:01:15 AM', '24/09/2017 7:01:30 AM', '24/09/2017 7:01:45 AM'] } df = pd.DataFrame(data) # 2. 转换时间列为datetime类型(用于时间差计算) df['Datetime'] = pd.to_datetime(df['Datetime'], format='%d/%m/%Y %I:%M:%S %p') # 3. 标记温度低于阈值的行,并生成连续分组ID df['below_threshold'] = df['Temperature'] < 100 df['group_id'] = (df['below_threshold'] != df['below_threshold'].shift()).cumsum() # 4. 按ID和分组聚合,提取每个连续低温段的起始时间 filtered_groups = df[df['below_threshold']].groupby(['ID', 'group_id']) result = filtered_groups.agg( Hour_start=('Datetime', 'first'), last_datetime=('Datetime', 'last') ).reset_index() # 5. 获取每个低温段的结束时间(即后续第一个温度回到阈值的时间) result['Hour_end'] = result.apply( lambda row: df.loc[ df[(df['ID'] == row['ID']) & (df['Datetime'] > row['last_datetime'])].index[0], 'Datetime' ], axis=1 ) # 6. 计算持续时长(秒)并格式化时间为原始格式 result['Duration'] = (result['Hour_end'] - result['Hour_start']).dt.total_seconds().astype(int) result['Hour_start'] = result['Hour_start'].dt.strftime('%d/%m/%Y %I:%M:%S %p').str.lstrip('0') result['Hour_end'] = result['Hour_end'].dt.strftime('%d/%m/%Y %I:%M:%S %p').str.lstrip('0') # 7. 整理最终输出列 final_result = result[['ID', 'Hour_start', 'Hour_end', 'Duration']] print(final_result)
关键步骤说明
- 时间列转换:将字符串格式的时间转为
datetime类型,才能进行时间差计算。 - 连续分组标识:通过比较当前行与上一行的
below_threshold状态,生成连续低温段的分组ID,确保同一连续时间段的行归为一组。 - 结束时间获取:取每个低温段最后一条记录的下一条记录时间(即温度回到100的时间),与样例输出逻辑匹配。
- 时长计算:通过时间差直接转换为秒数,再格式化回原始时间字符串格式。
内容的提问来源于stack exchange,提问作者user1405838
相关产品推荐
相关产品推荐

