Pandas dataframe:如何在时间序列中找到缺失的年份?

Pandas dataframe: how to find missing years in a timeseries?

我有一个带有时间戳索引和大约 100,000 行的 DataFrame。通过

df['year'] = df.index.year

创建一个包含每一行年份的新列很容易。现在我想找出我的时间序列中缺少哪些年份。到目前为止,我明白我可以使用 groupby 来获得 "something" 这让我可以找到唯一的值。因此,

grouped = df.groupby('year')
grouped.groups.keys()

将给我数据集中存在的年份。我现在可以用

构建一个完整的年份向量
pd.date_range(df.index.min(), df.index.max(), freq='AS')

然后通过重建索引,我应该能够找到缺失的年份,因为这些年份具有 NaN 值。

然而,看似简单的任务听起来很复杂,而且 grouped.groups 操作实际上需要相当长的时间;大概是因为它不仅会查找唯一键,还会构建属于每个键的行的索引列表,这是我在这里不需要的功能。

有什么方法可以获取数据框列的唯一元素更多directly/efficiently?

一种方法是构建一系列感兴趣的年份,然后使用 isin 查看缺失值:

In [89]:

year_s = pd.Series(np.arange(1993, 2015))
year_s
Out[89]:
0     1993
1     1994
2     1995
3     1996
4     1997
5     1998
6     1999
7     2000
8     2001
9     2002
10    2003
11    2004
12    2005
13    2006
14    2007
15    2008
16    2009
17    2010
18    2011
19    2012
20    2013
21    2014
dtype: int32

In [88]:

df = pd.DataFrame({'year':[1999, 2000, 2013]})
df
Out[88]:
   year
0  1999
1  2000
2  2013

In [91]:

year_s[~year_s.isin(df['year'])]
Out[91]:
0     1993
1     1994
2     1995
3     1996
4     1997
5     1998
8     2001
9     2002
10    2003
11    2004
12    2005
13    2006
14    2007
15    2008
16    2009
17    2010
18    2011
19    2012
21    2014
dtype: int32

因此,在您的情况下,您可以生成上述年份系列,然后对于您的 df,您可以使用以下方法获取年份:

df.index.year.unique()

这将比执行 groupby.

快得多

注意传递给arange的最后一个值不包含在

范围内

如果您只想要一个缺失年份的列表,您可以先将您的数据系列转换为一个列表,然后使用列表理解简单地构建一个缺失年份的列表:

years = df['year'].unique()
missing_years = [y for y in range(min(years), max(years)+1) if y not in years]