如何将DataFrame中GPS周内毫秒值转换为UTC时间?
GPS周毫秒值转UTC时间戳问题解决
错误根源
你写的apply代码里犯了个小错误:lambda里用df.time传入的是整个time列的Series,而timedelta的milliseconds参数只接受单个数值,这就导致了类型错误。
快速修复:正确使用apply
把lambda里的df.time改成x.time,同时加上axis=1指定按行处理:
df['Datetime'] = df.apply(lambda x: gps_datetime(2328, x.time), axis=1)
这样每次调用gps_datetime时,传入的是当前行的单个time值,就能正常生成时间戳了。
更优方案:向量化操作(推荐)
apply本质是逐行循环,数据量大的时候效率很低。用pandas的向量化操作能大幅提升速度,修改函数支持处理Series:
import pandas as pd from datetime import datetime, timedelta import pytz def gps_datetime_vec(time_week, time_ms_series, leap_seconds=18): gps_epoch = datetime(1980, 1, 6, tzinfo=pytz.utc) # 计算总秒数:GPS周转换为秒 + 毫秒转秒 - 闰秒 total_seconds = time_week * 7 * 24 * 3600 + (time_ms_series / 1000) - leap_seconds return gps_epoch + pd.to_timedelta(total_seconds, unit='s')
然后直接传入整个time列:
df['Datetime'] = gps_datetime_vec(2328, df['time'])
验证结果
用你提供的示例数据,两种方法都能得到正确结果:第一行的248400000会转换为2024-08-20 20:59:42+00:00,和你单独调用函数的输出一致。
内容的提问来源于stack exchange,提问作者cappo
相关产品推荐
相关产品推荐

