熊猫重采样()系列给出不正确的索引



我正在尝试对日期和浮点值的多年时间序列进行装箱。我正在尝试将每天汇总到 15 分钟的垃圾箱中。 因此,我按天对数据集进行分组,然后每天以 15 分钟的增量重新采样。

结果似乎很奇怪,所以我仔细研究了重新采样的行为。 下面的代码总结了我观察到的结果类型(我在 repl.it 中运行它)

aindex = pd.to_datetime([
"2013-04-05 04:15:31",
"2013-04-05 05:15:18",
"2013-04-05 05:15:19",
"2013-04-05 05:15:19",
"2013-04-05 05:17:15",
"2013-04-05 07:06:31",
"2013-04-09 04:15:31",
"2013-04-09 05:15:18",
"2013-04-09 05:15:19",
"2013-04-09 05:15:19",
"2013-04-09 05:17:15",
"2013-04-09 07:06:31",
"2013-04-09 07:21:28",
"2013-04-09 09:18:19",
"2013-04-09 09:19:19",
"2013-04-09 09:21:31"])
a = pd.Series([-4.50e+08,
-4.80e+08,
-6.10e+08,
-5.80e+08,
-5.70e+08,
-5.710e+08,
-4.598432e+08,
-4.814140e+08,
-6.109284e+08,
-5.870819e+08,
-5.759888e+08,
-5.713363e+08,
-5.275122e+07,
-2.853787e+08,
-2.523782e+08,
-4.273267e+08],aindex)
print(a)
print(a.groupby(a.index).apply(lambda x: x))
print(a.resample("15T", base=0).apply(lambda x: x))
print(a.groupby(a.index).resample("15T").apply(lambda x: x))
">

Groupby"的行为符合预期,但请注意,"x"的每个值都是PD类型。系列。"重新采样"还返回 PD 类型。系列,但当我在 repl.it 或 Jupyter 中显示它时似乎缺少值,但如果您将 .apply(lambda x:x) 更改为 .apply(lambda x: list(x)),您可以看到实际上有多个值。 "分组"+"重新采样"几乎达到了我的预期,即。每天有 15 分钟的箱,除了索引在"重新采样"返回多个值的任何地方都是错误的。

我试图了解我所看到的内容,以便我可以自信地应用该过程。 这是正确的行为吗?如果是,为什么?

注意:为了澄清更多我的期望。 如果我查看一天的重新采样结果,则重新采样包括空箱:

2013-04-05 04:15:00   -450000000.0
2013-04-05 04:30:00            NaN
2013-04-05 04:45:00            NaN
2013-04-05 05:00:00            NaN
2013-04-05 05:15:00   -570000000.0
2013-04-05 05:30:00            NaN
2013-04-05 05:45:00            NaN
2013-04-05 06:00:00            NaN
2013-04-05 06:15:00            NaN
2013-04-05 06:30:00            NaN
2013-04-05 06:45:00            NaN
2013-04-05 07:00:00   -571000000.0
2013-04-05 07:15:00            NaN
2013-04-05 07:30:00            NaN
2013-04-05 07:45:00            NaN
2013-04-05 08:00:00            NaN
2013-04-05 08:15:00            NaN
2013-04-05 08:30:00            NaN
2013-04-05 08:45:00            NaN
2013-04-05 09:00:00            NaN
2013-04-05 09:15:00            NaN
2013-04-05 09:30:00            NaN
2013-04-05 09:45:00            NaN
2013-04-05 10:00:00            NaN

但是,如果先完成分组,我不会得到空垃圾箱。 为什么不呢?:

...
2013-04-05 04:15:31  2013-04-05 04:15:00   -450000000.0
2013-04-05 05:15:18  2013-04-05 05:15:00   -480000000.0
2013-04-05 05:15:19  2013-04-05 05:15:00   -580000000.0
2013-04-05 05:17:15  2013-04-05 05:15:00   -570000000.0
2013-04-05 07:06:31  2013-04-05 07:00:00   -571000000.0
...

重采样是一个棘手的函数。重采样的主要问题是您需要选择要保留的值(使用pandas.DataFrame.lastpandas.DataFrame.first)。

这样做:

> a.resample("15T", base=0).last()
2013-04-05 04:15:00   -450000000.0
2013-04-05 04:30:00            NaN
2013-04-05 04:45:00            NaN
2013-04-05 05:00:00            NaN
2013-04-05 05:15:00   -570000000.0

将消除使用.apply(lambda x: x)的需要,因为它将保留示例中的最后一个元素。

pandas.DataFrame重新采样已使用mean作为默认值。

要获得与groupby等价物,您需要这样做更安全地分组然后应用平均值,以便我们可以插入区间的值

> a.groupby(a.index).mean().resample("15T", base=0).last()

2013-04-05 04:15:00   -450000000.0
2013-04-05 04:30:00            NaN
2013-04-05 04:45:00            NaN
2013-04-05 05:00:00            NaN
2013-04-05 05:15:00   -570000000.0

我希望正确理解你的问题。让我知道它是否有帮助。

编辑

您可以尝试使用以下方法保留所有索引:

> a.resample('15T').asfreq()    

但你会得到:ValueError: cannot reindex from a duplicate axis.

这是主要问题,大熊猫的索引不能复制。这就是为什么使用均值groupby起作用的原因,因为它将项目分组在一个元素的组中,然后对该组进行重新采样。

在不groupby的情况下实现此目的的一种方法是使用多索引数据帧:

> a.to_frame().set_index([a.index, a.index.round('15T')])
0
2013-04-05 04:15:31 2013-04-05 04:15:00 -450000000.0
2013-04-05 05:15:18 2013-04-05 05:15:00 -480000000.0
2013-04-05 05:15:19 2013-04-05 05:15:00 -610000000.0
2013-04-05 05:15:00 -580000000.0
2013-04-05 05:17:15 2013-04-05 05:15:00 -570000000.0
2013-04-05 07:06:31 2013-04-05 07:00:00 -571000000.0
2013-04-09 04:15:31 2013-04-09 04:15:00 -459843200.0
2013-04-09 05:15:18 2013-04-09 05:15:00 -481414000.0
2013-04-09 05:15:19 2013-04-09 05:15:00 -610928400.0
2013-04-09 05:15:00 -587081900.0
2013-04-09 05:17:15 2013-04-09 05:15:00 -575988800.0
2013-04-09 07:06:31 2013-04-09 07:00:00 -571336300.0
2013-04-09 07:21:28 2013-04-09 07:15:00  -52751220.0
2013-04-09 09:18:19 2013-04-09 09:15:00 -285378700.0
2013-04-09 09:19:19 2013-04-09 09:15:00 -252378200.0
2013-04-09 09:21:31 2013-04-09 09:15:00 -427326700.0

或者,将索引顺序更改为按舍入索引分组:

> a.to_frame().set_index([a.index.round('15T'), a.index])

2013-04-05 04:15:00 2013-04-05 04:15:31 -450000000.0
2013-04-05 05:15:00 2013-04-05 05:15:18 -480000000.0
2013-04-05 05:15:19 -610000000.0
2013-04-05 05:15:19 -580000000.0
2013-04-05 05:17:15 -570000000.0
2013-04-05 07:00:00 2013-04-05 07:06:31 -571000000.0
2013-04-09 04:15:00 2013-04-09 04:15:31 -459843200.0
2013-04-09 05:15:00 2013-04-09 05:15:18 -481414000.0
2013-04-09 05:15:19 -610928400.0
2013-04-09 05:15:19 -587081900.0
2013-04-09 05:17:15 -575988800.0
2013-04-09 07:00:00 2013-04-09 07:06:31 -571336300.0
2013-04-09 07:15:00 2013-04-09 07:21:28  -52751220.0
2013-04-09 09:15:00 2013-04-09 09:18:19 -285378700.0
2013-04-09 09:19:19 -252378200.0
2013-04-09 09:21:31 -427326700.0