【问题标题】:Combine multiple columns with different date ranges in Python在 Python 中组合具有不同日期范围的多列
【发布时间】:2019-03-03 02:30:55
【问题描述】:

我有多个具有不同日期范围(开始日期不同)的股票价格数据框作为索引。下面是三个例子。

Dataframe #1:
Date
12/15/1980      0.3936
12/16/1980      0.3648
12/17/1980      0.3738
12/18/1980      0.3846
12/19/1980      0.4081
...             ... 
09/21/2018      151.2600

Dataframe #2:
10/26/1993     0.7862
10/28/1993     0.7483
10/29/1993     0.7578
11/01/1993     0.7956
11/02/1993     0.7956
...            ...
09/21/2018     51.2000

Dataframe #3:
Date
10/26/1996      0.7862
10/28/1996      0.7483
10/29/1996      0.7578
11/01/1996      0.7956
11/02/1996      0.7956
...            ...
09/21/2018      36.5032

我想将这些数据框合并到一个表中,并以日期为索引。对于没有特定日期数据的股票,该“单元格”将为空白。

我有数百个这样的数据框。如果有人能帮我解决这个问题,我们将不胜感激!

【问题讨论】:

    标签: python dataframe merge concatenation


    【解决方案1】:

    使用concat:

    dfs = [df1, df2, df3]
    df = pd.concat(dfs, axis=1)
    df.index = pd.to_datetime(df.index, format='%m/%d/%Y')
    #if need sorted DatetimeIndex
    #df = df.sort_index()
    print (df)
                       a        b        c
    2018-09-21  151.2600  51.2000  36.5032
    1993-10-26       NaN   0.7862      NaN
    1996-10-26       NaN      NaN   0.7862
    1993-10-28       NaN   0.7483      NaN
    1996-10-28       NaN      NaN   0.7483
    1993-10-29       NaN   0.7578      NaN
    1996-10-29       NaN      NaN   0.7578
    1993-11-01       NaN   0.7956      NaN
    1996-11-01       NaN      NaN   0.7956
    1993-11-02       NaN   0.7956      NaN
    1996-11-02       NaN      NaN   0.7956
    1980-12-15    0.3936      NaN      NaN
    1980-12-16    0.3648      NaN      NaN
    1980-12-17    0.3738      NaN      NaN
    1980-12-18    0.3846      NaN      NaN
    1980-12-19    0.4081      NaN      NaN
    

    另一个解决方案是使用list comprehensionconcat 之前创建DatetimeIndex - 然后输出DatetimeIndex 也被排序:

    dfs = [df1, df2, df3]
    dfs1 = [x.set_index(pd.to_datetime(x.index, format='%m/%d/%Y')) for x in dfs]
    df = pd.concat(dfs1, axis=1)
    print (df)
                       a        b        c
    1980-12-15    0.3936      NaN      NaN
    1980-12-16    0.3648      NaN      NaN
    1980-12-17    0.3738      NaN      NaN
    1980-12-18    0.3846      NaN      NaN
    1980-12-19    0.4081      NaN      NaN
    1993-10-26       NaN   0.7862      NaN
    1993-10-28       NaN   0.7483      NaN
    1993-10-29       NaN   0.7578      NaN
    1993-11-01       NaN   0.7956      NaN
    1993-11-02       NaN   0.7956      NaN
    1996-10-26       NaN      NaN   0.7862
    1996-10-28       NaN      NaN   0.7483
    1996-10-29       NaN      NaN   0.7578
    1996-11-01       NaN      NaN   0.7956
    1996-11-02       NaN      NaN   0.7956
    2018-09-21  151.2600  51.2000  36.5032
    

    【讨论】:

    • @helloworldlevel - 谢谢,很高兴为您提供帮助。不要忘记接受答案,如果它适合你! :)
    【解决方案2】:
    dflist = [df1, df2, df3 ...]
    
    for df in dflist:
        df.index = pd.to_datetime(df.index,errors ='coerce')
    
    df_all = pd.concat([[df1, df2, df3 ..]],axis=1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多