我有一个数据帧,其中包含从一周开始(时间)开始的 GPS 毫秒数。我想将此数据转换为 UTC 时间戳。我有一个函数,但无法将其应用到我的数据框。数据框如下所示:
time,prn,msg,CNR
248400000,010,1C,44.375
248401000,010,1C,41.9375
248402000,010,1C,41.9375
248402000,010,1C,40.0625
248404000,010,1C,49.0
248405000,010,1C,45.54
我正在使用的功能在这里:
def gps_datetime(time_week, time_ms, leap_seconds=18):
gps_epoch = datetime(1980, 1, 6, tzinfo=pytz.utc)
return gps_epoch + timedelta(weeks=time_week,
milliseconds=time_ms,
seconds=-leap_seconds)
因此,该函数单独运行时效果很好。我可以将以下信息传递给它,它会给我正确的答案,例如
print(gps_datetime(2328, 248400000))
2328是指GPS周数,248400000是自一周开始以来的毫秒数。
这给出了以下结果,这是正确的。
2024-08-20 20:59:42+00:00
但是,我想将其应用于数据框中的列以创建新列。我用过这行代码:
df['Datetime'] = df.apply((lambda x: gps_datetime(2328,df.time)))
但是,这给了我一条错误消息
TypeError: unsupported type for timedelta milliseconds component: Series
我认为这与不正确的数据类型有关,原始的“时间”列是一个整数。我认为它需要是 timedelta 数据类型,因此在尝试应用它之前使用了这行代码。
df.time = pd.to_timedelta(df.time, unit='ms')
我收到了与之前相同的错误消息。
有人有什么建议吗?
问题是
pd.DataFrame.apply
总是会以一系列方式传递。所以 time_week
在应用过程中看起来更像是函数调用内部的这样:
0 248400000
1 248401000
2 248402000
3 248402000
4 248404000
5 248405000
Name: time, dtype: int64 <class 'pandas.core.series.Series'>
并且
timedelta
不知道如何处理数据。
通常,(除非您想要该系列)最好在单列上进行应用。那是:
df['time'].apply((lambda x: gps_datetime(2328,x)))
如果您想在数据框上调用它,那么您需要
time
值。所以它看起来像:
df.apply((lambda s: gps_datetime(2328,s.time)),axis=1)
希望这有帮助!