Python Multiindex - 如何在只有时间作为索引的数据框中创建分层多索引?

Posted

技术标签:

【中文标题】Python Multiindex - 如何在只有时间作为索引的数据框中创建分层多索引?【英文标题】:Python Multindex - How can I create a hierarchical multindex in a dataframe that has time only as indexes? 【发布时间】:2021-12-11 23:58:30 【问题描述】:

假设我有一个看起来像这样的 Dataframe df

       9-2021   8-2021  7-2021  
Datetime                                                        
13:00:00    0.000   0.000   0.0000   
13:05:00    -0.003  -0.005  0.0010     
13:10:00    -0.009  -0.005  -0.0020 
  
...
            
23:50:00   0.004   -0.001  0.006    
23:55:00    0.006  -0.008  -.006   
00:00:00    0.005   -0.001  -.003    
00:05:00    0.004  -0.002 -0.008    
00:10:00   -0.010   0.006  -0.001   
00:15:00   0.008  0.003  -0.001

...   

23:50:00  -0.001  0.005  0.009        
23:55:00    0.006  -0.008  -.006        
00:00:00    0.005   -0.001  -.003          
00:05:00    0.004  -0.002 -0.008 

我想将我的索引转换为多索引,以便创建进一步的细分级别,以指定我每次经过午夜时都将移动到下一天。所以接下来的几天应该是这样的。有什么想法吗?

            9-2021  8-2021  7-2021
Day   Datetime  
                                                    
D     13:00:00  0.000   0.000   0.0000   
      13:05:00  -0.003  -0.005  0.0010     
      13:10:00  -0.009  -0.005  -0.0020   
      ...            
      23:50:00   0.004   -0.001  0.006    
      23:55:00    0.006  -0.008  -.006   
D+1   00:00:00    0.005   -0.001  -.003    
      00:05:00    0.004  -0.002 -0.008    
      00:10:00   -0.010   0.006  -0.001   
      00:15:00   0.008  0.003  -0.001
      ...                                   

      23:50:00  -0.001  0.005  0.009        
      23:55:00    0.006  -0.008  -.006 
       
D+2   00:00:00    0.005   -0.001  -.003          
      00:05:00    0.004  -0.002 -0.008 

【问题讨论】:

请提供足够的代码,以便其他人更好地理解或重现问题。 【参考方案1】:

这应该适合你。你可以玩弄编号,但从零开始是最容易的。当您浏览该示例时,您会看到。

data='''       9-2021   8-2021  7-2021
Datetime
13:00:00    0.000   0.000   0.0000
13:05:00    -0.003  -0.005  0.0010
13:10:00    -0.009  -0.005  -0.0020
23:50:00   0.004   -0.001  0.006
23:55:00    0.006  -0.008  -.006
00:00:00    0.005   -0.001  -.003
00:05:00    0.004  -0.002  -0.008
00:10:00   -0.010   0.006  -0.001
00:15:00   0.008  0.003  -0.001
23:50:00  -0.001  0.005  0.009
23:55:00    0.006  -0.008  -.006
00:00:00    0.005   -0.001  -.003
00:05:00    0.004  -0.002  -0.008 '''

import io
df = pd.read_csv(io.StringIO(data), sep=' \s+', engine='python')

# use cumcount to count values in each group
df['day_counter'] = df.groupby(df.index').cumcount()+1

# set data to np.nan for further processing
df.loc[df.index!='00:00:00', 'day_counter'] = np.nan

# forward fill
df['day_counter'] = df['day_counter'].fillna(method="ffill")
df['day_counter'] = df['day_counter'].fillna(0)
df['day_counter'] = df['day_counter'].fillna(0).astype('int')

# set multiIndex
df.set_index(['day_counter', df.index], inplace=True)

df

                      9-2021  8-2021  7-2021
day_counter Datetime
0           13:00:00   0.000   0.000   0.000
            13:05:00  -0.003  -0.005   0.001
            13:10:00  -0.009  -0.005  -0.002
            23:50:00   0.004  -0.001   0.006
            23:55:00   0.006  -0.008  -0.006
1           00:00:00   0.005  -0.001  -0.003
            00:05:00   0.004  -0.002  -0.008
            00:10:00  -0.010   0.006  -0.001
            00:15:00   0.008   0.003  -0.001
            23:50:00  -0.001   0.005   0.009
            23:55:00   0.006  -0.008  -0.006
2           00:00:00   0.005  -0.001  -0.003
            00:05:00   0.004  -0.002  -0.008

【讨论】:

谢谢乔纳森!超级有帮助。假设我不是从 0 开始,而是从 D-5 开始(其中 D 代表前一天)。然后当我们穿过午夜时,我们去 D-4 等等?我一直在尝试替换 fillna 中的 0,但不知道如何构建临时计数。 也许只取当前输出并从系列中减去 5。 0 变为 -5,1 变为 -4,依此类推。

以上是关于Python Multiindex - 如何在只有时间作为索引的数据框中创建分层多索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Python Pandas中将MultiIndex Dataframes与权重合并?

折叠熊猫 MultiIndex

在python中使用multiindex合并多个数据框

pandas 与 MultiIndex 合并,当只有一级索引用作键时

Python - reshape,pivot,unstack - multiindex

Python 数据处理(二十九)—— MultiIndex 高级索引操作