计算pandas数据帧中的年数

时间:2016-03-18 17:40:05

标签: python pandas

我编写了一个混乱的函数,它根据数据的长度计算数据框中的年数(假设数据框具有一年中每一天的值)。

它工作正常,但是很多代码可以变得更加智能(但我不确定如何......)

这是函数,它只用了10年,我希望它适用于任何大小的数据集。我可以通过复制和粘贴以及进一步添加总数来进一步扩展它,但必须有更聪明的方法来编写此代码。

def numyears(x):
    if len(x.index) <= 366:
        return 1
    elif len(x.index) <= 732:
        return 2
    elif len(x.index) <= 1098:
        return 3
    elif len(x.index) <= 1464:
        return 4
    elif len(x.index) <= 1830:
        return 5
    elif len(x.index) <= 2196:
        return 6
    elif len(x.index) <= 2562:
        return 7
    elif len(x.index) <= 2928:
        return 8
    elif len(x.index) <= 3294:
        return 9
    elif len(x.index) <= 3660:
        return 10
    else: 
        return 'ERROR'

3 个答案:

答案 0 :(得分:4)

只需将索引的长度除以365

def numyears(x):
     return len(x.index) / 365 # use // for python 3

如上所述,这将进行整数除法并匹配您在此处的输出。这将缩放任何大小的数据框

编辑以上解决方案采用最低限度的方法,在重新阅读帖子后,OP使用了上限方法。为此

return len(x.index) / 365 + 1

答案 1 :(得分:4)

仅访问year属性然后获取唯一值的len似乎更合理:

In [2]:
s = pd.date_range(dt.datetime(1900,1,1), end=dt.datetime(2000,1,1), freq='6M')
s

Out[2]:
DatetimeIndex(['1900-01-31', '1900-07-31', '1901-01-31', '1901-07-31',
               '1902-01-31', '1902-07-31', '1903-01-31', '1903-07-31',
               '1904-01-31', '1904-07-31',
               ...
               '1995-01-31', '1995-07-31', '1996-01-31', '1996-07-31',
               '1997-01-31', '1997-07-31', '1998-01-31', '1998-07-31',
               '1999-01-31', '1999-07-31'],
              dtype='datetime64[ns]', length=200, freq='6M')

In [8]:
len(np.unique(s.year))

Out[8]:
100
通过这种方式,它可以处理不常见的时段,缺少的日期,与年份边界重叠的条目等。

您还可以将索引转换为Series并致电nunique

In [11]:
s.to_series().dt.year.nunique()

Out[11]:
100

看到你已经将日期时间作为一列,那么这将起作用:

df['date_col'].dt.year.nunique()

如有必要,您可以使用以下方式转换为日期时间:

df['date_col'] = pd.to_datetime(df['date_col'])

<强>更新

所以看起来您的要求是计算完整的年份,如果您将索引设置为年份和日期组件,那么您可以计算年级,然后过滤不是&gt; = 365的行来为您提供数字完整年份:

In [34]:
df = pd.DataFrame({'date':pd.date_range(dt.datetime(1900,6,1), end=dt.datetime(1910,6,1))})
count = df.set_index([df['date'].dt.year, df['date'].dt.day]).count(level=0)
count

Out[34]:
      date
date      
1900   214
1901   365
1902   365
1903   365
1904   366
1905   365
1906   365
1907   365
1908   366
1909   365
1910   152

In [39]:
len(count[count >= 365].dropna())

Out[39]:
9

答案 2 :(得分:1)

您可以创建所有年份的集合,然后返回其长度。

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randn(365*10, 3), 
                  columns=list('ABC'), 
                  index=pd.date_range('2000-1-1', periods=365*10))

# Number of unique years
>>> len(set(ts.year for ts in df.index))
10

如果索引的类型为datetime或string,则首先需要将其转换为时间戳:

>>> len(set(ts.year for ts in pd.to_datetime(df.index)))
10