如何在Pandas时间索引中找到缺口

2 投票
3 回答
1810 浏览
提问于 2025-04-18 07:12

我想知道一个时间索引是否有空缺。比如我有以下这个序列:

ss = pd.Series( nr.randn(3), index=[ '2014-01-01', '2014-01-02', '2014-01-03' ] )
ss.index = pd.to_datetime( ss.index )
ss

输出结果是:

2014-01-01    0.976455
2014-01-02   -0.610322
2014-01-03   -0.631592
dtype: float64

我原以为可以像处理列表那样来处理它(用 l[1:]-l[:-1])。

ss.index[1:] - ss.index[:-1]

但是这里的输出结果让我搞不懂。

<class 'pandas.tseries.index.DatetimeIndex'>
[2014-01-03]
Length: 1, Freq: None, Timezone: None

最后我做了这个(虽然看起来有点丑)。

tmp = pd.Series( ss.index[1:] ) - pd.Series( ss.index[:-1] )
(tmp[0] == tmp ).all()

所以我有两个问题:

  • ss.index[1:] - ss.index[:-1] 这个操作是干嘛的?
  • 有没有更好的方法来做我正在做的事情?

3 个回答

1

你可以使用 numpy.diff() 来实现这个功能:

np.diff(np.array(ss.index))

可能还有其他更简单的方法来做到这一点,但上面的方法是有效的。它会给你:

array([86400000000000, 86400000000000], dtype='timedelta64[ns]')
1

你可以试试这个

tDelta = ss.index.date[1:]-ss.index.date[:-1]
secondBetweenEachEntries = [t.total_seconds() for t in tDelta]

这样会得到

import pandas as pd
import numpy.random as nr
ss = pd.Series( nr.randn(3), index=[ '2014-01-01', '2014-01-02', '2014-01-03' ] )
ss.index = pd.to_datetime( ss.index )
tDelta = ss.index.date[1:]-ss.index.date[:-1]
1

这是一种稍微不同的方法。如果可以的话,会返回一个频率(比如说,如果数据是每天都有的,没有缺失的情况,就会返回每天的频率)。如果不行的话,就会返回None

In [14]: pd.infer_freq(Series(np.random.randn(3),index=['20140101','20140102','20140103']).index)
Out[14]: 'D'

In [15]: pd.infer_freq(Series(np.random.randn(3),index=['20140101','20140102','20140104']).index)

In [31]: pd.infer_freq(Series(np.random.randn(3),index=['20140101','20140201','20140301']).index)
Out[31]: 'MS'

撰写回答