【问题标题】:Pandas Merging two dataframes with joining on date between dates熊猫合并两个数据框并在日期之间加入日期
【发布时间】:2019-08-08 06:02:09
【问题描述】:

有一个很有趣的案例。

df_1time 列基于这样的低粒度数据(2s):

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_1df_2 合并,df_1 的时间将介于df_2 中的每两个连续时间行之间(在给出标签的一小时之间)。如果我在df_2 中有两个时间列(如startTimeendTime),我会使用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 有没有办法解决这个问题?

【问题讨论】:

  • 您能否将屏幕截图作为示例数据添加到您的问题中以便我们复制?
  • 您能向我们展示您的样本数据吗? (不是图片)
  • 如果要计数,请按小时使用resample
  • 没问题,只是添加了值
  • 更新了帖子

标签: python pandas datetime merge timedelta


【解决方案1】:

这是pd.merge_asofproblem,我在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]

【讨论】:

  • 我猜这里有2s间隔和merge_asof不适合的问题。如果是 1s 那么是的,我认为它可以使用
  • @Keithx 检查其中的容差,并通过您的 2 秒条件 :-)
【解决方案2】:

我使用解决方法解决了这个问题,将时间分成datehour 列。也许不是太花哨,但它解决了交易并且非常简单:

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())

【讨论】:

    猜你喜欢
    • 2016-12-08
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    相关资源
    最近更新 更多