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

Python 根据最近的小时和日期选择行,python,pandas,datetime,select,Python,Pandas,Datetime,Select,我有两种数据,一种是dataframe,另一种是现在很多列表都包含有关图像采集的数据,因此数据如下所示: >>>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:

我有两种数据,一种是dataframe,另一种是现在很多列表都包含有关图像采集的数据,因此数据如下所示:

>>>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:01:00          2019-06-23       07:00:00     0.108      0.370
1 2019-06-23 09:32:00          2019-06-23       07:00:00     0.101      0.360
...
熊猫数据帧(日期和时间从2007年6月23日到4月4日,每天从07:00到17:00):

以列表形式拍摄每张图像的小时数(小时后的数字代表日期):

我想根据小时列表选择数据框中的行,例如,选择最接近图像小时的行。 例如,对于23/6,图像的第一个小时是07:00,而不是08:00,然后是09:32…
因此,我希望在我的数据帧中只包含t其小时数与映像小时数最接近的行。
我看到有很多方法可以过滤它,正如这里提到的(),但我想考虑到这样一个事实:我每个日期都有不同的时间

所以结果应该是这样的:

>>>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:01:00          2019-06-23       07:00:00     0.108      0.370
1 2019-06-23 09:32:00          2019-06-23       07:00:00     0.101      0.360
...

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

基本前提是制作一个数据帧
h23
,例如,带有照片的所有时间戳。使用此功能与df时间戳合并,使用具有最接近时间匹配功能的
pd.merge\u asof
<代码>最近的表示实际时间可以是前后,但如果时间需要是事件发生前的最近时间,则也可以选择向后和向前

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

不同的月份也有相同的小时列表吗?是的,你怎么知道24小时是6月还是7月?数据只针对6月和7月,所以只有两个月,以及每天的具体小时数(2019年1月7日1小时,2019年6月30日30小时等,具体来说是mroe——日期介于23/6至04/7之间,所以社区维基和100多名代表的6月24日。他们似乎忽略了
pd.merge\u asof()
。这是
pd.Index.asof()
无法实现的。
              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