当前位置: 代码迷 >> python >> 将 Pandas 中的时间列从浮点数转换为实际时间值
  详细解决方案

将 Pandas 中的时间列从浮点数转换为实际时间值

热度:57   发布时间:2023-07-16 11:08:30.0

问题语句#1(简单)我想将数据帧的时间列转换为实际时间值,如“12:01:45”hh:mm:ss

尝试过: df_new["time_1"] = pd.to_datetime(df_new.TIME)这给了我一个新行 - 但它显示的是日期值而不是时间。 :(

然后我尝试了df_new['Time_1'] = pd.to_datetime(df_new['TIME'], format='%H%M').dt.time但输出是: ValueError: time data '0' does not match format ' %H%M'(匹配)

预期 >> time_1 在 hh:mm:ss

样本数据 :

    PRIMARY_KEY     DATE    TIME        LATITUDE    LONGITUDE   ALTITUDE    DATE_1  time_1
0   b04acedfaa0a    43900   0.499964    43.738003   -79.815340  221.0   2020-03-10  1970-01-01
1   efc27d128dac    43900   0.500140    43.736450   -79.813030  221.0   2020-03-10  1970-01-01
2   19b344a8ef88    43900   0.500293    43.730568   -79.821304  216.0   2020-03-10  1970-01-01
3   0c67c3eefb73    43900   0.500431    43.742660   -79.831710  235.0   2020-03-10  1970-01-01

问题陈述#2(复杂且具有挑战性)转换为实际时间后,我想执行一些操作。

输入将是一个主键值(比如 19b344a8ef88)

操作,我想制作满足两个条件的主键对:

a) 接近 50 米的距离(通过使用 LAT 和 LONG)和

b) 几乎同时,说 10 分钟的时差

我期望的输出形式为:

Primary Key     Instances
b04acedfaa0a.   5
efc27d128dac.   3

意味着总共 5 次 b04acedfaa0a 主键在 19b344a8ef88 附近并同时是 50 mtrs。

希望我能解释自己......

当您给to_datetime()一个普通的旧整数或浮点值时,它会将该值视为自“UNIX 纪元”或 1970 年 1 月 1 日以来的秒数。这就是time_1中的值都是1970-01-01 如果您有兴趣,可以阅读更多相关信息。

要解决您的问题,您似乎需要解决两件事。

首先,确保您在TIME 中存储的值是 Unix 时代的正确时间,或者找到另一种存储时间的方法。

一旦解决了这个问题,你就会在time_1 中存储一个时间戳,所以你可以通过使用类似df_new["time_1"].dt.time东西来获取它的时间部分,它应该以“hh:mm”的形式给你一些东西:ss”。 您可以将这些值存储在另一列中。

对于您的第一个问题,快速解决方法是在导入之前将数据格式化为 csv。 在将 csv 加载到 python 之前,您可以尝试在 excel 中将“DATE”列更改为“Short date”,将“TIME”列更改为“Time”并保存 csv(重命名,以免覆盖原始文件)然后尝试在 python 中导入?

在python中可能有一种聪明的方法来做到这一点。

对于您的第二个问题,如果您按照以下步骤操作,您可能会得到想要的结果:

  1. 使用pd.merge()使用“主键”连接数据帧
  2. 使用df.query()过滤加入的数据集以满足您的额外条件(即接近 50 米的距离和最大 10 分钟的时差)
  3. 使用df['Primary key'].value_counts()获取每个主键的计数以获取您的实例
  相关解决方案