代码之家  ›  专栏  ›  技术社区  ›  00__00__00

重新采样后合并pandas数据帧

  •  1
  • 00__00__00  · 技术社区  · 8 年前

    我有一个带有日期时间索引的数据框架。

    df1=pd.DataFrame(index=pd.date_range('20100201', periods=24, freq='8h3min'),
                    data=np.random.rand(24),columns=['Rubbish'])
    df1.index=df1.index.to_datetime()
    

    我要重新采样此数据帧,如下所示:

    df1=df1.resample('7D').agg(np.median)
    

    然后我有另一个数据帧,具有不同频率的索引,从不同的偏移小时开始

    df2=pd.DataFrame(index=pd.date_range('20100205', periods=24, freq='6h3min'),
                    data=np.random.rand(24),columns=['Rubbish'])
    df2.index=df2.index.to_datetime()
    df2=df2.resample('7D').agg(np.median)
    

    这些操作独立地工作得很好,但是当我尝试使用

    print(pd.merge(df1,df2,right_index=True,left_index=True,how='outer'))
    

    我得到:

    Rubbish_x  Rubbish_y
    2010-02-01   0.585986        NaN
    2010-02-05        NaN   0.423316
    2010-02-08   0.767499        NaN
    

    同时我想用相同的偏移量对两者重新采样,并在合并后得到以下结果

                Rubbish_x  Rubbish_y
    2010-02-01   AVALUE        AVALUE
    2010-02-08   AVALUE        AVALUE
    

    我试过以下方法,但它只会产生nans

    df2.reindex(df1.index)
    
    print(pd.merge(df1,df2,right_index=True,left_index=True,how='outer'))
    

    我必须坚持 pandas 0.20.1 .

    我试过了 mergeas_of

    df1.index
    Out[48]: Index([2015-03-24, 2015-03-31, 2015-04-07, 2015-04-14, 2015-04-21, 2015-04-28], dtype='object')
    
    df2.index
    Out[49]: Index([2015-03-24, 2015-03-31, 2015-04-07, 2015-04-14, 2015-04-21, 2015-04-28], dtype='object')
    output=pd.merge_asof(df1,df2,left_index=True,right_index=True)
    

    但它崩溃了

    Traceback (most recent call last):
    
    
    TypeError: 'NoneType' object is not callable
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   jezrael    8 年前

    我相信需要 merge_asof :

    print(pd.merge_asof(df1,df2,right_index=True,left_index=True))
                Rubbish_x  Rubbish_y
    2010-02-01   0.446505        NaN
    2010-02-08   0.474330   0.606826
    

    或参数 method='nearest' 到 reindex :

    df2 = df2.reindex(df1.index, method='nearest')
    print (df2)
                 Rubbish
    2010-02-01  0.415248
    2010-02-08  0.415248
    
    print(pd.merge(df1,df2,right_index=True,left_index=True,how='outer'))
                Rubbish_x  Rubbish_y
    2010-02-01   0.431966   0.415248
    2010-02-08   0.279121   0.415248
    
        2
  •  1
  •   Manoj Kumar    8 年前

    我认为遵循代码库可以完成你的任务。

    >>> index = pd.date_range('1/1/2000', periods=9, freq='T')
    >>> series = pd.Series(range(9), index=index)
    >>> series
    2000-01-01 00:00:00    0
    2000-01-01 00:01:00    1
    2000-01-01 00:02:00    2
    2000-01-01 00:03:00    3
    2000-01-01 00:04:00    4
    2000-01-01 00:05:00    5
    2000-01-01 00:06:00    6
    2000-01-01 00:07:00    7
    2000-01-01 00:08:00    8
    Freq: T, dtype: int64
    
    >>> series.resample('3T').sum()
    2000-01-01 00:00:00     3
    2000-01-01 00:03:00    12
    2000-01-01 00:06:00    21
    Freq: 3T, dtype: int64
    

    https://pandas.pydata.org/pandas-docs/version/0.22/generated/pandas.DataFrame.resample.html