You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:计算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)

关键步骤说明

  1. 时间列转换:将字符串格式的时间转为datetime类型,才能进行时间差计算。
  2. 连续分组标识:通过比较当前行与上一行的below_threshold状态,生成连续低温段的分组ID,确保同一连续时间段的行归为一组。
  3. 结束时间获取:取每个低温段最后一条记录的下一条记录时间(即温度回到100的时间),与样例输出逻辑匹配。
  4. 时长计算:通过时间差直接转换为秒数,再格式化回原始时间字符串格式。

内容的提问来源于stack exchange,提问作者user1405838

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 20:15:22