【问题标题】:Pandas : merge on date and hour from datetime index熊猫:从日期时间索引合并日期和小时
【发布时间】:2019-06-27 23:16:58
【问题描述】:

我有两个数据框,如下所示,数据框 A 有日期时间,即使是分钟,数据框 B 只有小时。

df:A

dataDate             original    
2018-09-30 11:20:00     3
2018-10-01 12:40:00     10
2018-10-02 07:00:00     5
2018-10-27 12:50:00     5
2018-11-28 19:45:00     7

df:B
dataDate             count    
2018-09-30 10:00:00     300
2018-10-01 12:00:00     50
2018-10-02 07:00:00     120
2018-10-27 12:00:00     234
2018-11-28 19:05:00     714

我喜欢根据小时日期和小时合并两者,所以现在数据框 A 中的所有行都应该在日期和小时合并的基础上填充

我可以尝试通过

 A['date'] = A.dataDate.date
 B['date'] = B.dataDate.date

 A['hour'] = A.dataDate.hour
 B['hour'] = B.dataDate.hour

然后合并

 merge_df = pd.merge(A,B, how='left', left_on=['date', 'hour'], 
           right_on=['date', 'hour'])

但这是一个非常漫长的过程,他们是在 pandas 时间序列或日期功能的帮助下执行相同操作的有效方法吗?

【问题讨论】:

    标签: python pandas datetime merge time-series


    【解决方案1】:

    如果需要,使用map 仅将一列从B 附加到Afloor 用于设置minutes 和seconds(如果存在)到0

    d = dict(zip(B.dataDate.dt.floor('H'), B['count']))
    A['count'] = A.dataDate.dt.floor('H').map(d)
    print (A)
                 dataDate  original  count
    0 2018-09-30 11:20:00         3    NaN
    1 2018-10-01 12:40:00        10   50.0
    2 2018-10-02 07:00:00         5  120.0
    3 2018-10-27 12:50:00         5  234.0
    4 2018-11-28 19:45:00         7  714.0
    

    对于一般解决方案,请使用DataFrame.join:

    A.index = A.dataDate.dt.floor('H')
    B.index = B.dataDate.dt.floor('H')
    
    A = A.join(B, lsuffix='_left')
    print (A)
                              dataDate_left  original            dataDate  count
    dataDate                                                                    
    2018-09-30 11:00:00 2018-09-30 11:20:00         3                 NaT    NaN
    2018-10-01 12:00:00 2018-10-01 12:40:00        10 2018-10-01 12:00:00   50.0
    2018-10-02 07:00:00 2018-10-02 07:00:00         5 2018-10-02 07:00:00  120.0
    2018-10-27 12:00:00 2018-10-27 12:50:00         5 2018-10-27 12:00:00  234.0
    2018-11-28 19:00:00 2018-11-28 19:45:00         7 2018-11-28 19:05:00  714.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 2016-07-05
      • 2013-07-20
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 2017-02-09
      相关资源
      最近更新 更多