如何按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']]
示例输出
| ID | sex | labeled_state | duration |
|---|---|---|---|
| 001 | Male | IND_1 | 0 days 01:23:00 |
| 001 | Male | ACT_1 | 0 days 00:45:00 |
| 001 | Male | IND_2 | 0 days 02:10:00 |
| 002 | Female | FOR_1 | 0 days 03:05:00 |
内容的提问来源于stack exchange,提问作者Anne Landine
相关产品推荐
相关产品推荐

