为了账号安全,请及时绑定邮箱和手机立即绑定

根据最接近的小时和日期选择行

根据最接近的小时和日期选择行

蝴蝶刀刀 2023-12-05 15:21:50
我有两种数据,一种是数据帧,一种是现在许多列表包含有关图像采集时间的数据,因此数据如下所示:pandas 数据框(日期和时间为 23/6 -04/07,每天 07:00-17:00):>>>timestamp                    date             hour        person_1   person_2 ............0 2019-06-23 07:00:00          2019-06-23       07:00:00     0.124      0.4311 2019-06-23 07:03:00          2019-06-23       07:03:00     0.131      0.4382 2019-06-23 07:06:00          2019-06-23       07:06:00     0.154      0.4333 2019-06-23 07:09:00          2019-06-23       07:09:00     0.164      0.441....2 2019-07-04 16:57:00          2019-07-04       16:57:00     0.864      0.6753 2019-07-04 17:00:00          2019-07-04       17:00:00     0.823      0.631每张图像拍摄的时间以列表的格式(“小时”一词后面的数字代表日期):#Hours that the image was takenHours23=['07:00','08:00','09:32','10:14','11:15','12:17','13:03','14:41','15:04','17:05']Hours24=['07:00','08:13','09:02','10:09','11:02','12:03','14:09','16:00','17:00']Hours25=['08:15','09:02','10:02','11:02','12:02','14:02','15:02','16:00','17:00']...Hours3=['07:00','08:02','09:02','10:02','11:02','12:02','13:03','14:03','15:02','16:01','17:00']Hours4=['07:15','08:02','12:02','13:03']我想根据这些小时列表选择数据框中的行,例如,选择最接近图像的小时的行。例如,对于 23/6,图像的第一个小时是 07:00,然后是 08:00,然后是 09:32...所以我想在我的数据框中仅包含该时间最接近的行到图像小时。我看到有多种方法可以过滤它,正如这里提到的(在 Pandas 中查找最接近给定时间的 DataFrame 行),但我想考虑到每个日期都有不同的时间这一事实。所以结果应该是这样的:>>>timestamp                    date             hour        person_1   person_2 ............0 2019-06-23 07:00:00          2019-06-23       07:00:00     0.124      0.4311 2019-06-23 08:01:00          2019-06-23       07:00:00     0.108      0.3701 2019-06-23 09:32:00          2019-06-23       07:00:00     0.101      0.360...
查看完整描述

1 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

您的时间列表不是一种理想的格式,因此我将向您展示一个日期的方法,其中数据框h23是手动构建的。如果需要,您可以对其进行编码以构建一个包含所有时间的数据框。


基本前提是制作一个数据框h23,例如包含照片的所有时间戳。使用它与 df 时间戳合并,使用pd.merge_asof它可以进行最接近的时间匹配。 nearest意味着实际时间可以是之前或之后,但是如果时间需要是事件之前的最近时间,则还有 和 的backward选项。forward


import pandas as pd


df = pd.DataFrame({'timestamp': {0: '2019-06-23 07:00:00',

  1: '2019-06-23 07:03:00',

  2: '2019-06-23 07:06:00',

  3: '2019-06-23 07:09:00'},

 'date': {0: '2019-06-23', 1: '2019-06-23', 2: '2019-06-23', 3: '2019-06-23'},

 'hour': {0: '07:00:00', 1: '07:03:00', 2: '07:06:00', 3: '07:09:00'},

 'person_1': {0: 0.124, 1: 0.131, 2: 0.154, 3: 0.16399999999999998},

 'person_2': {0: 0.431, 1: 0.43799999999999994, 2: 0.433, 3: 0.441}})


df['timestamp'] = pd.to_datetime(df['timestamp'])


Hours23=['07:00','08:00','09:32','10:14','11:15','12:17','13:03','14:41','15:04','17:05']


h23 = pd.DataFrame({'Time':Hours23, 'Day':'2019-06-23'})


h23['timestamp'] = pd.to_datetime(h23['Day'] + " " + h23['Time'])


pd.merge_asof(h23,df, on='timestamp', direction='nearest').drop(columns=['Day','Time'])

输出


              timestamp      date       hour    person_1    person_2

0   2019-06-23 07:00:00 2019-06-23  07:00:00    0.124   0.431

1   2019-06-23 08:00:00 2019-06-23  07:09:00    0.164   0.441

2   2019-06-23 09:32:00 2019-06-23  07:09:00    0.164   0.441

3   2019-06-23 10:14:00 2019-06-23  07:09:00    0.164   0.441

4   2019-06-23 11:15:00 2019-06-23  07:09:00    0.164   0.441

5   2019-06-23 12:17:00 2019-06-23  07:09:00    0.164   0.441

6   2019-06-23 13:03:00 2019-06-23  07:09:00    0.164   0.441

7   2019-06-23 14:41:00 2019-06-23  07:09:00    0.164   0.441

8   2019-06-23 15:04:00 2019-06-23  07:09:00    0.164   0.441

9   2019-06-23 17:05:00 2019-06-23  07:09:00    0.164   0.441


查看完整回答
反对 回复 2023-12-05
  • 1 回答
  • 0 关注
  • 51 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信