我编写了一个混乱的函数,它根据数据帧的长度计算数据帧中的年数(假设数据帧具有一年中每一天的值)。
它工作得很好,但是有很多代码可以变得更智能(但我不知道如何......)
这是函数,它只持续 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'
Run Code Online (Sandbox Code Playgroud)
访问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
Run Code Online (Sandbox Code Playgroud)
通过这种方式,它可以处理不频繁的周期、缺失的日期、与年份边界重叠的条目等。
您还可以将索引转换为 aSeries并调用nunique:
In [11]:
s.to_series().dt.year.nunique()
Out[11]:
100
Run Code Online (Sandbox Code Playgroud)
鉴于您已经将日期时间作为一列,那么这将起作用:
df['date_col'].dt.year.nunique()
Run Code Online (Sandbox Code Playgroud)
如有必要,您可以使用以下方法转换为日期时间:
df['date_col'] = pd.to_datetime(df['date_col'])
Run Code Online (Sandbox Code Playgroud)
更新
所以看来您的要求是计算完整的年份,如果您将索引设置为年和日部分,那么您可以在年份级别进行计数,然后过滤不 >= 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3153 次 |
| 最近记录: |