使用时间序列重新索引数据帧

Posted

技术标签:

【中文标题】使用时间序列重新索引数据帧【英文标题】:Reindexing a dataframe using a time series 【发布时间】:2021-07-26 08:13:50 【问题描述】:

我有一个数据框 (df),其中包含一个名为“日期”的变量,我使用以下代码对其进行索引:

idx = df.groupby(pd.PeriodIndex(data=df.date, freq='10min'))
df = idx.sum()

因为我的数据中有“漏洞”,我想用 NaN 填充,所以我想使用名为 ts 的完整时间序列重新索引此数据帧:

print(ts)

array(['2014-08-19T00:00:00.000000000', '2014-08-19T00:10:00.000000000', '2014-08-19T00:20:00.000000000', ..., '2015-08-16T23:40:00.000000000', '2015-08-16T23:50:00.000000000', '2015-08-17T00:00:00.000000000'], dtype='datetime64[ns]')

为了重新索引,我使用以下代码:

df = df.reindex(ts).copy()

但收到以下错误消息:

---------------------------------------------------------------------------

AttributeError                            Traceback (most recent call last)

<ipython-input-160-2c1b1d883eb1> in <module>()
----> 1 bi = bi.reindex(index)

10 frames

/usr/local/lib/python3.7/dist-packages/pandas/core/arrays/period.py in dt64arr_to_periodarr(data, freq, tz)
    952             data, freq = data._values, data.dt.freq
    953 
--> 954     freq = Period._maybe_convert_freq(freq)
    955 
    956     if isinstance(data, (ABCIndexClass, ABCSeries)):

pandas/_libs/tslibs/period.pyx in pandas._libs.tslibs.period._Period._maybe_convert_freq()

AttributeError: 'NoneType' object has no attribute 'n'

有人可以向我解释为什么我会收到此消息吗?谢谢

这是 df 的一部分:

date                      aa      bb      cc                                       
2014-08-19 00:00         781   9.798   9.289  
2014-08-19 00:10         782  10.004   9.382  
2014-08-19 00:20         783   9.832   9.434  
2014-08-19 00:30         784  10.019   9.593  
2014-08-19 00:40         785  10.087  10.028  

【问题讨论】:

你能发布 df 以便我们也可以运行它 完成。感谢您对我的问题感兴趣! 【参考方案1】:

使用DatetimeIndex 应该可以工作。

PeriodIndex 用于timespan,但这里我们处理的是timestamps

我们得到了AttributeError: 'NoneType' object has no attribute 'n',因为我们试图用PeriodIndex 重新索引ts。

代码

idx = df.groupby(pd.DatetimeIndex(data=df.date, freq='10min'))
df = idx.sum()

ts=['2014-08-19T00:00:00.000000000', '2014-08-19T00:10:00.000000000', '2014-08-19T00:20:00.000000000', '2015-08-16T23:40:00.000000000', '2015-08-16T23:50:00.000000000', '2015-08-17T00:00:00.000000000']
ts=pd.DatetimeIndex(ts)

df.reindex(ts)

输出

                    aa      bb      cc
2014-08-19 00:00:00 781.0   9.798   9.289
2014-08-19 00:10:00 782.0   10.004  9.382
2014-08-19 00:20:00 783.0   9.832   9.434
2015-08-16 23:40:00 NaN NaN NaN
2015-08-16 23:50:00 NaN NaN NaN
2015-08-17 00:00:00 NaN NaN NaN

【讨论】:

您是否从两个地方(即 idx 和 ts)替换了 PeriodIndex。不可能得到相同的错误,因为现在您现在没有使用“PeriodIndex”,并且错误是针对时期freq = Period._maybe_convert_freq(freq) 它来自于索引没有附加频率的事实: DatetimeIndex(['2014-08-19 00:00:00', '2014-08-19 00:10:00', '2014-08-19 00:20:00', '2014-08-19 00:30:00', '2014-08-19 00:40:00', '2014-08-19 00:50:00' ... '2015-08-16 22:30 :00'、'2015-08-16 22:40:00'、'2015-08-16 22:50:00'、'2015-08-16 23:00:00'、'2015-08-16 23 :10:00', '2015-08-16 23:20:00', '2015-08-16 23:30:00', '2015-08-16 23:40:00', '2015-08- 16 23:50:00', '2015-08-17 00:00:00'], dtype='datetime64[ns]', length=13393, freq=None) 能否请您将完整的代码粘贴到问题中。 github.com/pandas-dev/pandas/issues/33358 另外,如果 DTI 的元素间隔不均匀,freq 将始终为 None。

以上是关于使用时间序列重新索引数据帧的主要内容,如果未能解决你的问题,请参考以下文章

如何重新索引 MultiIndex 数据帧

重新索引 MultiIndex 数据帧的特定级别

在循环内重新索引数据帧

Pandas:在多索引数据帧中重新索引和插值

使用索引日期时间从 pandas 数据帧创建 json

合并具有不同索引的两个数据帧,同时使用一行代码保留主数据帧的索引