问题描述
问题语句#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。
希望我能解释自己......
1楼
当您给to_datetime()
一个普通的旧整数或浮点值时,它会将该值视为自“UNIX 纪元”或 1970 年 1 月 1 日以来的秒数。这就是time_1中的值都是1970-01-01
。
如果您有兴趣,可以阅读更多相关信息。
要解决您的问题,您似乎需要解决两件事。
首先,确保您在TIME 中存储的值是 Unix 时代的正确时间,或者找到另一种存储时间的方法。
一旦解决了这个问题,你就会在time_1 中存储一个时间戳,所以你可以通过使用类似df_new["time_1"].dt.time
东西来获取它的时间部分,它应该以“hh:mm”的形式给你一些东西:ss”。
您可以将这些值存储在另一列中。
2楼
对于您的第一个问题,快速解决方法是在导入之前将数据格式化为 csv。 在将 csv 加载到 python 之前,您可以尝试在 excel 中将“DATE”列更改为“Short date”,将“TIME”列更改为“Time”并保存 csv(重命名,以免覆盖原始文件)然后尝试在 python 中导入?
在python中可能有一种聪明的方法来做到这一点。
对于您的第二个问题,如果您按照以下步骤操作,您可能会得到想要的结果:
-
使用
pd.merge()
使用“主键”连接数据帧 -
使用
df.query()
过滤加入的数据集以满足您的额外条件(即接近 50 米的距离和最大 10 分钟的时差) -
使用
df['Primary key'].value_counts()
获取每个主键的计数以获取您的实例