Python 合并两个数据帧并在日期之间连接日期

Python 合并两个数据帧并在日期之间连接日期,python,pandas,datetime,merge,timedelta,Python,Pandas,Datetime,Merge,Timedelta,我有一个很有趣的案例 基于低粒度数据(2s),有df_1和time列,如下所示: 2018-08-31 22:59:47.980000+00:00 41.77 2018-08-31 22:59:49.979000+00:00 42.76 2018-08-31 22:59:51.979000+00:00 40.86 2018-08-31 22:59:53.979000+00:00 41.83 2018-08-31 22:59:55.979000+00

我有一个很有趣的案例

基于低粒度数据(2s),有
df_1
time
列,如下所示:

2018-08-31 22:59:47.980000+00:00    41.77   
2018-08-31 22:59:49.979000+00:00    42.76   
2018-08-31 22:59:51.979000+00:00    40.86   
2018-08-31 22:59:53.979000+00:00    41.83   
2018-08-31 22:59:55.979000+00:00    41.73   
2018-08-31 22:59:57.979000+00:00    42.71
此外,还有带标签的
df_2
数据和
time
列(以小时为单位):

2018-08-31 22:00:00 0.0
2018-08-31 23:00:00 1.0
2018-09-01 00:00:00 0.0
2018-09-01 01:00:00 1.0
2018-09-01 02:00:00 0.0
我想将
df_1
df_2
合并,从df_1开始的时间将在
df_2
中的每两个连续时间行之间(一个小时之间用于给出标签)。如果我在
dfu 2
中有两个时间列(如
startTime
endTime
),我将使用
pandasql
及其机会:

import pandasql 

sqlcode = '''
select *
from df_1
inner join df_2 on df_1.time >= df_2.startTime and df_1.time <= df_2.endTime
'''

newdf = ps.sqldf(sqlcode,locals())
导入pandasql
sqlcode=''
挑选*
来自df_1

在df_1.time>=df_2.startTime和df_1.time上的内部连接df_2这是
pd.merge_asof
问题,我在df2中创建一个日期的keydat对偶,以显示我们从df2合并的日期

#df1.Date=pd.to_datetime(df1.Date)
#df2.Date=pd.to_datetime(df2.Date)
yourdf=pd.merge_asof(df1,df2.assign(keydate=df2.Date),on='Date',direction='forward')
yourdf
                     Date         ...                     keydate
0 2018-08-31 22:59:47.980         ...         2018-08-31 23:00:00
1 2018-08-31 22:59:49.979         ...         2018-08-31 23:00:00
2 2018-08-31 22:59:51.979         ...         2018-08-31 23:00:00
3 2018-08-31 22:59:53.979         ...         2018-08-31 23:00:00
4 2018-08-31 22:59:55.979         ...         2018-08-31 23:00:00
5 2018-08-31 22:59:57.979         ...         2018-08-31 23:00:00
[6 rows x 4 columns]

我使用将时间拆分为
date
hour
列的变通方法解决了这个问题。也许不太花哨,但它解决了问题,而且非常直截了当:

import pandasql as ps

df_1['date'] = [d.date() for d in df_1['time']]
df_1['time'] = df_1['time'].dt.round('H').dt.hour

df_2['date'] = [d.date() for d in df_2['time']]
df_2['time'] = df_2['time'].dt.round('H').dt.hour

sqlcode = '''
select *
from df_1
inner join df_2 on df_1.time=df_2.time and df_1.date=df_2.date
'''

newdf = ps.sqldf(sqlcode,locals())

你能在你的问题中添加截图作为样本数据,以便我们可以复制吗?你能给我们展示你的样本数据吗?(不是图片)如果要计数,请按小时使用。没问题,只是增加了值更新了帖子。我猜问题是有2秒的间隔和合并时间不适合这里。如果是1,那么是的,我想可以used@Keithx检查其中的公差,并通过2s条件:-)