【问题标题】:Convert time column in pandas from float to actual time value将 pandas 中的时间列从浮点数转换为实际时间值
【发布时间】:2020-07-02 19:48:51
【问题描述】:

问题陈述 #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: 时间数据 '0' 与格式 '%H%M' 不匹配(匹配)

预期 >> time_1 in 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。

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

【问题讨论】:

    标签: python pandas date datetime time


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我可以和你分享我的 git repo,你可以看到数据(.csv 文件)吗?我不擅长解释问题:/
    • 在将 csv 加载到 python 之前,您可以尝试在 excel 中将 'DATE' 列更改为 'Short date' 并将 'TIME' 列更改为 'Time' 并保存 csv(重命名以便您不要覆盖您的原始文件)然后尝试在 python 中导入?
    • 完成!!我在保存 CSV 文件时犯了错误。现在也可以导入日期和时间了。
    • 将日期和时间作为单独的列导入,因为那是输入文件,然后再次将它们合并以形成日期时间文件以供进一步操作 >> df_new['date_time'] = pd.to_datetime(df_new ['DATE'] + ' ' + df_new['TIME'])
    【解决方案2】:

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

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

    首先,确保您在 TIME 中存储的值是来自 Unix 纪元的正确时间,或者找到另一种存储时间的方式。

    一旦解决了,您将在 time_1 中存储一个时间戳,因此您可以使用 df_new["time_1"].dt.time 之类的东西来获取其中的时间部分,这应该会以“ hh:mm:ss”。您可以将这些值存储在另一列中。

    【讨论】:

    • 第一件事“检查 :: TIME 是 Unix 时代的正确时间,或者找到另一种存储时间的方法”。我该怎么做,我想我在这里需要帮助.. 因为当我尝试 df_new["time_1"].dt.time 时,它​​给我的都是 00:00:00
    • 这是因为 Unix 纪元后 0.5 毫秒是 00:00:00。你想在 TIME 中存储什么?某天的某个时间?完成某件事所需的时间?
    • 感谢 ton Andrew,明白了.. 是的,我错误地执行了错误的时间导入。排序。现在
    猜你喜欢
    • 2018-12-23
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 2019-06-16
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多