我编写了以下函数,以查找我要计算的年份之前的数据集中的最新日期。我很难理解为什么它不能在for循环中工作,但是会不在一个循环中工作。如果我用硬编码值作为年份编写它,它将运行良好。但是,当我尝试将其放入循环中时,会出现以下错误:
“ ValueError:max()arg是一个空序列”
谢谢您对为什么会引发错误的任何见解,以及我可以采取的解决措施。
def max_date_prior_to_year(dates, yr):
return max(dates[dates<pd.to_datetime(str(yr)+'-01-01')])
print(max_date_prior_to_year(df['Date'], 2014))
2013-10-15 00:00:00
for yr in [2011,2012,2013,2014]:
print(max_date_prior_to_year(df['Date'], yr))
ValueError: max() arg is an empty sequence
答案 0 :(得分:0)
max_date_prior_to_year(df['Date'], 2014)
作为2014
参数提供yr
。但是您的for
循环以2011
开始。如果df['Date']
在2011年1月1日之前没有日期,则dates[dates<pd.to_datetime(str(yr)+'-01-01')]
将返回一个空序列,因此您可以有效地进行计算:
max(pd.Series()) # ValueError: max() arg is an empty sequence
按照docs:
如果iterable为空且未提供默认值,则
ValueError
被举起。
pd.Series.max
而不是内置的max
可以避免ValueError
并提高效率的一种方法是使用pd.Series.max
而不是Python内置的max
。 1 这将返回{{ 1}},如果布尔索引后该系列为空。因此,将您的功能更改为:
NaN
1 实际上,通常,您应该首选Pandas数值方法,而不是在pandas系列上应用内置函数。