如何在熊猫中设置具有多个日期的多索引?

Posted

技术标签:

【中文标题】如何在熊猫中设置具有多个日期的多索引?【英文标题】:How to set a multiindex with multiple dates in pandas? 【发布时间】:2021-11-28 07:19:26 【问题描述】:

我有以下数据框df

Datetime1              Datetime2             Value
2018-01-01 00:00       2018-01-01 01:00      5
2018-01-01 01:00       2018-01-01 02:00      1
2018-01-01 02:00       2018-01-01 03:00      2
2018-01-01 03:00       2018-01-01 04:00      3
2018-01-01 04:00       2018-01-01 05:00      6

我想设置一个由Datetime1Datetime2组成的多索引,以进一步进行数据重采样和插值(从1小时到30分钟的频率)。

如果我做df.set_index(["Datetime1","Datetime2"]).resample("30T").ffill(),那么它会失败。

期望的输出:

Datetime1              Datetime2             Value
2018-01-01 00:00       2018-01-01 01:00      5
2018-01-01 00:30       2018-01-01 01:30      5
2018-01-01 01:00       2018-01-01 02:00      1
2018-01-01 01:30       2018-01-01 02:30      1
...

【问题讨论】:

看起来 MultiIndex 不是适合您的工具。它用于分层索引,即带有组。见这里pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html你想达到什么目的? Datetime2 总是从 Datetime1 偏移 1 小时 你想要的输出是什么?考虑使用单个日期时间索引,但设置其frequency(根据您的数据判断,它将是“1h”)。然后重新采样数据帧。 @Joooeey:是的,Datetime2 始终与Datetime1 相差 1 小时。我只需要将数据从 1 小时频率重新采样到 30 分钟频率,保持相同的偏移量。对于Value,我想申请ffill() @michcio1234:所需的输出是相同的数据帧,但从 1 小时到 30 分钟的频率重新采样。如何设置单个日期时间索引和频率? 请在更新中查看所需的输出。 【参考方案1】:

多索引不是用于双索引,而是用于分层(分组)索引。 See the docs. 你在 cmets 中说,Datetime2 总是偏移 1 小时。这意味着重新计算它可能是最快的:

df.set_index("Datetime1","Datetime2").resample("30T").ffill()
df["Datetime2" = df.index + pd.Timedelta(1, "hour")

【讨论】:

【参考方案2】:

如果有一小时的差异,可以在resample 之后创建MultiIndex,并将1H 添加到新的DatetimeIndex

df = df.set_index(["Datetime1"])[['Value']].resample("30T").ffill()
df = df.set_index([df.index.rename('Datetime2') + pd.Timedelta('1H')], append=True)

print (df)
                                         Value
Datetime1           Datetime2                 
2018-01-01 00:00:00 2018-01-01 01:00:00      5
2018-01-01 00:30:00 2018-01-01 01:30:00      5
2018-01-01 01:00:00 2018-01-01 02:00:00      1
2018-01-01 01:30:00 2018-01-01 02:30:00      1
2018-01-01 02:00:00 2018-01-01 03:00:00      2
2018-01-01 02:30:00 2018-01-01 03:30:00      2
2018-01-01 03:00:00 2018-01-01 04:00:00      3
2018-01-01 03:30:00 2018-01-01 04:30:00      3
2018-01-01 04:00:00 2018-01-01 05:00:00      6

或者:

s = df.set_index(["Datetime1"])['Value'].resample("30T").ffill()
s.index = [s.index,s.index.rename('Datetime2') + pd.Timedelta('1H')]

print (s)
Datetime1            Datetime2          
2018-01-01 00:00:00  2018-01-01 01:00:00    5
2018-01-01 00:30:00  2018-01-01 01:30:00    5
2018-01-01 01:00:00  2018-01-01 02:00:00    1
2018-01-01 01:30:00  2018-01-01 02:30:00    1
2018-01-01 02:00:00  2018-01-01 03:00:00    2
2018-01-01 02:30:00  2018-01-01 03:30:00    2
2018-01-01 03:00:00  2018-01-01 04:00:00    3
2018-01-01 03:30:00  2018-01-01 04:30:00    3
2018-01-01 04:00:00  2018-01-01 05:00:00    6
Name: Value, dtype: int64

【讨论】:

jezrael,如果 Datetime1 和 Datetime2 需要为 00:00 和 00:30 而不是 00:00 和 01:30,那么方法将是相似的,对吧?只是 Datetime2 将移动 30 分钟而不是 1 小时。 @Fluxy - 你是对的。将+ pd.Timedelta('1H') 更改为+ pd.Timedelta('30Min')

以上是关于如何在熊猫中设置具有多个日期的多索引?的主要内容,如果未能解决你的问题,请参考以下文章

使熊猫具有多索引列的多个数据框并完全连接

枢轴熊猫数据框具有多索引列

如何将熊猫数据框转换为多索引数据框

如何将多索引列转换为熊猫数据框的单索引列?

对唯一顺序索引的多索引熊猫数据框进行切片和赋值

在熊猫多索引数据框中返回满足逻辑索引条件的每个组的最后一行[重复]