如何将函数应用于数据帧以将从一周开始到 UTC 的 GPS 毫秒数更改为 UTC

问题描述 投票:0回答:1

我有一个数据帧,其中包含从一周开始(时间)开始的 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')

我收到了与之前相同的错误消息。

有人有什么建议吗?

python pandas time gps
1个回答
0
投票

错误说明

问题是

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
不知道如何处理数据。

解决方案1

通常,(除非您想要该系列)最好在单列上进行应用。那是:

df['time'].apply((lambda x: gps_datetime(2328,x)))

解决方案2

如果您想在数据框上调用它,那么您需要

  1. 使用您创建的 lamabda var
  2. 使用轴 1(而不是默认轴 0)运行应用
  3. 从 apply 语句中生成的行 Series 中获取
    time
    值。

所以它看起来像:

df.apply((lambda s: gps_datetime(2328,s.time)),axis=1)

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.