我编写了以下函数,用于查找我正在计算的年份之前的数据集中的最近日期。我很难理解为什么它不能在 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
您正在比较苹果和橙子
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
根据文档:
如果可迭代对象为空且未提供默认值,则
ValueError
被提出。
使用pd.Series.max
而不是内置max
避免ValueError
并提高效率的一种方法是使用pd.Series.max
而不是 Python 的内置max
。1如果序列在布尔索引后为空,这将返回NaN
。因此,请将函数更改为:
def max_date_prior_to_year(dates, yr):
return dates[dates<pd.to_datetime(str(yr)+'-01-01')].max()
1事实上,作为一项规则,您应该更喜欢 Pandas 数字方法,而不是在 pandas 系列上应用内置函数。