Панды Слияние двух датафреймов с объединением по дате между датами - PullRequest
0 голосов
/ 17 марта 2019

У меня довольно интересный случай.

Существует df_1 со столбцом time на основе данных с низкой степенью детализации (2 с), например:

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 (от одного часа до присвоения метки). Если бы у меня было два временных столбца в df_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())

Но в этом случае у меня только один столбец. Есть ли способ решить эту проблему в Pandas?

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Это проблема pd.merge_asof, я создаю двойное число дат в df2, чтобы показать, какую дату мы объединяем из 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]
0 голосов
/ 18 марта 2019

Я решил проблему, используя обходной путь с разбивкой по столбцам 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())
...