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与权重合并?
pandas 与 MultiIndex 合并,当只有一级索引用作键时