如何在Python中计算鱼类跨日期昼夜时段的累计游动距离
解决跨日期昼夜时段的鱼类游动距离累计问题
需求与问题背景
需要计算研究期间鱼类每个独立昼夜时段的累计游动距离,现有包含以下字段的DataFrame:
Dates:记录日期Covered Distance:游动距离(单位:km)DayNight:标记时段为昼(Day)或夜(Night)
示例数据:
Dates Covered Distance DayNight 0 2019-08-12 1 Day 1 2019-08-12 2 Night 2 2019-08-12 1 Night 3 2019-08-12 2 Night 4 2019-08-13 3 Night 5 2019-08-13 4 Night 6 2019-08-13 2 Day 7 2019-08-13 1 Day 8 2019-08-13 2 Night 9 2019-08-14 2 Night 10 2019-08-14 3 Night 10 2019-08-14 1 Day ....
此前尝试的代码仅能计算所有昼/夜的总累计距离,无法区分跨日期的独立昼夜时段:
Df2 = Df1.groupby('DayNight').Distance.sum() # 或者 Df2 = Df1.groupby('DayNight').cumsum().reset_index()
核心痛点:单个夜晚可能跨越两个日期,必须为每个独立的昼夜时段分配唯一编号,才能实现精准分组累计。
解决方案
步骤1:识别昼夜时段切换点
通过对比当前行与前一行的DayNight值,标记时段切换的位置:
# 生成切换标记:当前行与前一行DayNight不同时标记为1 Df1['period_switch'] = (Df1['DayNight'] != Df1['DayNight'].shift(1)).astype(int)
步骤2:生成唯一时段ID
对切换标记做累加操作,得到每个独立昼夜时段的唯一ID:
# 累加切换标记,生成每个时段的唯一ID Df1['period_id'] = Df1['period_switch'].cumsum()
步骤3:分组计算累计距离
基于period_id和DayNight分组,计算每个独立时段的累计游动距离:
# 分组求和,得到每个独立时段的累计距离 result = Df1.groupby(['period_id', 'DayNight'])['Covered Distance'].sum().reset_index()
可选:补充时段日期范围
如果需要明确每个时段的起止日期,可以扩展聚合逻辑:
result = Df1.groupby(['period_id', 'DayNight']).agg( total_distance=('Covered Distance', 'sum'), start_date=('Dates', 'min'), end_date=('Dates', 'max') ).reset_index()
最终结果示例
处理后将得到包含每个独立昼夜时段累计距离的DataFrame:
period_id DayNight total_distance start_date end_date 0 1 Day 1 2019-08-12 2019-08-12 1 2 Night 8 2019-08-12 2019-08-13 2 3 Day 3 2019-08-13 2019-08-13 3 4 Night 7 2019-08-13 2019-08-14 4 5 Day 1 2019-08-14 2019-08-14
内容的提问来源于stack exchange,提问作者toms
相关产品推荐
相关产品推荐

