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

如何按ID计算连续行为状态轨迹的时间间隔?

计算动物行为数据中连续状态的持续时间

假设你的数据集已加载到Pandas DataFrame df 中,包含ID(个体编号)、sex(性别)、timestamp_adjusted(校准时间戳)、States(行为状态)四个字段。以下是解决连续状态段区分与时长计算的具体步骤:

步骤1:按个体和时间排序

确保每个个体的行为数据按时间顺序排列,否则连续状态判断会出错:

import pandas as pd

# 按ID和时间戳排序,重置索引
df = df.sort_values(by=['ID', 'timestamp_adjusted'], ignore_index=True)

步骤2:标记连续状态段

对比当前行与上一行的状态,为每个连续状态段生成唯一分组标记:

# 对每个ID单独处理,状态变化时分组标记递增
df['state_segment'] = df.groupby('ID')['States'].apply(
    lambda x: (x != x.shift()).cumsum()
).reset_index(drop=True)

这一步会给同一ID下的每段连续相同状态分配递增数字标记,比如ID1的连续IND段标记为1,后续ACT段标记为2,再次出现的IND段标记为3。

步骤3:聚合计算状态段时长

按个体、性别、状态段、行为状态分组,计算每个段的持续时间(结束时间-开始时间):

# 聚合得到每个状态段的核心信息
segment_stats = df.groupby(
    ['ID', 'sex', 'state_segment', 'States'],
    as_index=False
).agg(
    duration=('timestamp_adjusted', lambda x: x.max() - x.min()),
    start_time=('timestamp_adjusted', 'min'),
    end_time=('timestamp_adjusted', 'max')
)

步骤4:生成带序号的状态标签

为同一ID下的同一行为状态的不同连续段添加序号(如IND_1、IND_2):

# 为每个ID+状态的组合生成连续段序号
segment_stats['seq_num'] = segment_stats.groupby(['ID', 'States']).cumcount() + 1
# 拼接成带序号的状态标签
segment_stats['labeled_state'] = segment_stats['States'] + '_' + segment_stats['seq_num'].astype(str)

最终结果整理

按需保留字段,比如只留核心输出字段:

final_result = segment_stats[['ID', 'sex', 'labeled_state', 'duration']]

示例输出

IDsexlabeled_stateduration
001MaleIND_10 days 01:23:00
001MaleACT_10 days 00:45:00
001MaleIND_20 days 02:10:00
002FemaleFOR_10 days 03:05:00

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:50:26