代码之家  ›  专栏  ›  技术社区  ›  Maeaex1

如何用多索引合并数据帧

  •  0
  • Maeaex1  · 技术社区  · 6 年前

    我想创建一个基于日期和时间的多索引从我的 DataFrame - df. 这确实有效而且 indexed 返回正确的多索引(连续日期从2017年10月2日到2018年3月31日,连续时间从08:00:00到21:55:00,间隔5分钟)。

    问题是我的数据集没有完整的观察结果。意味着,对于一个随机的一天,08:05:00到08:40:00之间可能会有缺失的观测值。我的Multiindex的长度是20496,而DataFrame的长度是20486。

    DataFrame 所有观察结果均为 NAN DataFrame - df ?

    df = pd.read_csv(file_name, parse_dates=[0], 
    index_col=0, sep=',')
    df['Date'] = df.index.date
    df['Time'] = df.index.time
    df['Time'] = df['Time'].astype(str)
    df = df[df['Time'] != '22:00:00']
    
    list_date = set(df['Date'])
    list_time = set(df['Time'])
    
    list_date = sorted(list_date)
    list_time = sorted(list_time)
    
    iterables = [list_date, list_time]
    indexed = pd.MultiIndex.from_product(iterables, 
    names=['date', 'time'])
    df_new = pd.DataFrame(df, index=indexed)
    

    df 输出:

                                r2     var_v2x        Date      Time
    TIME1                                                            
    2017-10-02 08:00:00         NaN  0.00008784  2017-10-02  08:00:00
    2017-10-02 08:05:00  0.00000000  0.00008784  2017-10-02  08:05:00
    2017-10-02 08:10:00  0.00000008  0.00008784  2017-10-02  08:10:00
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Maeaex1    6 年前

    找到了一个解决方案(可能不是一个优雅的方案)。

    df = pd.read_csv(file_name, parse_dates=[0], index_col=0, sep=',')
    df['Date'] = df.index.date
    df['Time'] = df.index.time
    df['Time'] = df['Time'].astype(str)
    
    df = df[df['Time'] != '22:00:00']
    
    list_date = set(df['Date'])
    list_time = set(df['Time'])
    
    list_date = sorted(list_date)
    list_time = sorted(list_time)
    
    iterables = [list_date, list_time]
    indexed = pd.MultiIndex.from_product(iterables, names=['date', 'time'])
    
    df_index_date = indexed.get_level_values(0)
    df_index_time = indexed.get_level_values(1)
    
    df_joined = pd.DataFrame(df_index_date.astype(str) + ' ' + df_index_time.astype(str))
    df_joined = df_joined.reset_index()
    df_joined = df_joined.set_index(df_joined[0])
    del df_joined['index']
    del df_joined[0]
    
    df_final = df_joined.join(df)
    df_final = df_final.reset_index(drop=True)
    df_final = df_final.set_index(indexed)