Pandas 多列时间序列按 MMSI 与航次分组的等间隔重采样与插值教程
技术百科
心靈之曲
发布时间:2026-01-18
浏览: 次 本文详解如何对含 mmsi 和 departures_count 分组标识的船舶轨迹数据,按 10 分钟固定频率进行重采样,并对 calc_speed、coursechange 等多列执行线性/立方插值,避免 groupby + resample 直接调用导致的 nan 或重复值问题。
在船舶 AIS 数据分析中,原始记录常存在不规则采样间隔(如数秒至数十分钟不等),而下游建模或可视化往往要求统一时间粒度(如每 10 分钟一个观测点)。直接使用 groupby(...).resample('10Min').interpolate() 容易失败——因为 resample 在分组内默认以原始索引为基准聚合,若未对齐目标网格,会返回全 NaN 或错误复用首尾值。
正确做法是:为每个 (mmsi, departures_count) 子组独立构建 10 分钟规则时间网格,再通过 reindex → interpolate → reindex 三步完成精准插值。该方案兼顾上采样(填补密集点间的空隙)与下采样(跨大间隔插值),且天然支持多列同步处理。
以下为完整实现代码(支持线性与立方插值):
import pandas as pd
import numpy as np
def resample_trip(g, freq='10Min', method='linear'):
"""
对单个航次子组执行等间隔重采样插值
:param g: 分组后的 DataFrame(已设 timestamp 为 DatetimeIndex)
:param freq: 目标频率,如 '10Min'
:param method: 插值方法,'linear' / 'cubic' / 'time' 等
:return: 重采样后 DataFrame,索引为规则时间点
"""
if len(g) == 0:
return g
# 步骤1:生成覆盖全程的规则时间网格(向上/向下取整到 freq 边界)
start = g.index[0].floor(freq)
end = g.index[-1].ceil(freq)
rng = pd.date_range(start, end, freq=freq)
# 步骤2:扩展索引并插值(limit_direction='both' 确保两端可插)
g_extended = g.reindex(g.index.union(rng))
g_interp = g_extended.interpolate(method=method, limit_direction='both')
# 步骤3:精确提取目标网格点(丢弃原始非网格点)
result = g_interp.reindex(rng)
return result
# 预处理:确保 timestamp 为 datetime 并设为索引
df["timestamp"] = pd.to_datetime(df["timestamp"])
df = df.set_index("timestamp")
# 按 MMSI 与航次分组,应用自定义重采样函数
out = df.groupby(["mmsi", "departures_count"], group_keys=False).apply(
resample_trip, freq='10Min', method='cubic' # ← 切换 cubic 即可启用三次样条插值
)
print(out.head(10))✅ 关键优势说明:
- 分组隔离性:每个 (mmsi, departures_count) 独立生成时间网格,避免跨航次污染;
- 插值鲁棒性:reindex(...union...) 确保原始点全部保留,interpolate(limit_direction='both') 允许双向延伸插值(尤其对起止点有效);
- 方法灵活:仅需修改 method 参数即可切换 'linear'(默认)、'cubic'(需至少 4 个点)、'time'(按实际时间距离加权)等;
-
多列安全:所有数值列(如 calc_
speed, coursechange, lat, lon)自动同步插值,无需逐列指定。
⚠️ 注意事项:
- 若某航次数据点少于 2 个,cubic 插值将退化为线性或报错,建议增加判断逻辑(如 if len(g)
- coursechange(航向变化)存在周期性(0°/360°跳变),线性插值可能产生不合理中间值,此时应先做相位解缠(np.unwrap)再插值;
- 对超大数据集(228 万+ 行),可添加 progress_apply 或分块处理提升响应速度。
通过该方法,您将获得严格对齐的 10 分钟粒度轨迹数据,为后续速度趋势分析、航向模式挖掘或深度学习建模奠定高质量时序基础。
# ai
# 深度学习
# 高质量
# 大数据
# 并对
# 自定义
# 三步
# 时应
# 数十
# app
# 您将
# 设为
# if
# 报错
# len
# pandas
# union
# 插值
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- MAC如何隐藏文件夹及文件_MAC终端命令隐藏与第
- php485能和物联网模块通信吗_php485对接
- Win11如何设置省电模式 Win11开启电池节电
- Win10怎样安装Excel数据分析工具_Win1
- Windows音频驱动无声音原因解析_声卡驱动错误
- Win11怎么清理C盘虚拟内存_Win11清理虚拟
- Python文件操作优化_大文件与流处理解析【教程
- c++如何实现一个高性能的环形队列(Ring Bu
- Python网络超时处理_健壮性设计说明【指导】
- PHP主流架构怎么监控运行状态_工具推荐【操作】
- php查询数据怎么分组_groupby分组查询配合
- Win11 C盘满了怎么清理 Win11磁盘清理和
- 如何在Golang中实现服务熔断与限流_Golan
- php下载安装后swoole扩展怎么安装_异步框架
- Go 语言标准库为何不提供泛型切片的 Contai
- php中作用域操作符能访问私有静态属性吗_访问权限
- php中::能访问全局变量吗_全局作用域与类作用域
- php打包exe后无法写入文件_权限问题解决方法【
- Python网页解析流程_html结构说明【指导】
- Windows10如何更改系统字体大小_Win10
- Win10电脑C盘红了怎么清理_Windows10
- Windows10如何查看蓝屏日志_Win10使用
- Win11怎么关闭贴靠布局_Win11禁用窗口最大
- Win11文件扩展名怎么显示_Win11查看文件后
- Python正则表达式实战_模式匹配说明【教程】
- php怎么下载安装后测试是否成功_简单脚本验证方法
- Win11怎么关闭开机声音_Win11系统启动提示
- windows如何修改文件默认打开方式_windo
- Win11怎么关闭系统推荐内容_Windows11
- Windows10系统怎么查看系统版本_Win10
- 如何在Golang中使用encoding/gob序
- Win11怎么关闭自动更新 Win11永久关闭系统
- 如何使用Golang理解结构体指针方法接收者_Go
- Python安全爬虫设计_IP代理池与验证码识别策
- Win11怎么开启游戏模式_Win11优化游戏帧数
- Win11怎么关闭触控板_Win11笔记本禁用触摸
- Win11怎么清理C盘系统错误报告_Win11清理
- Win10路由器怎么隐藏ssid Win10隐藏w
- 如何使用Golang实现负载均衡_分发请求到多个服
- Win10怎么关闭自动更新错误弹窗_Win10策略
- C++ STL算法库怎么用?C++常用算法函数(s
- 零基础学会Python自动化办公_高效处理Exce
- Win11怎么开启窗口对齐助手_Windows11
- 如何使用Golang优化模块引入路径_Golang
- Windows Defender扫描失败怎么办_安
- 使用类变量定义字符串常量时如何实现类型安全的 Li
- 如何使用正则表达式提取以编号开头、后跟多个注解的完
- Win10系统更新错误0x80240034怎么办
- 静态属性修改会影响所有实例吗_php作用域操作符下
- Python爬虫项目实战教程_Scrapy抓取与存


QQ客服