我有以下DataFrame:
P N ID Year Month
TS
2016-06-26 19:30:00 263.600006 5.4 5 2016 6
2016-06-26 20:00:00 404.700012 5.6 5 2016 6
2016-06-26 21:10:00 438.600006 6.0 5 2016 6
2016-06-26 21:20:00 218.600006 5.6 5 2016 6
2016-07-02 16:10:00 285.300049 15.1 5 2016 7
我正在尝试根据列 Year
和 Month
的值添加新的列,类似于以下内容:
def exp_records(row):
return calendar.monthrange(row['Year'], row['Month'])[1]
df['exp_counts'] = df.apply(exp_records, axis=1)
但是我遇到了以下错误:
TypeError: ('integer argument expected, got float', 'occurred at index 2016-06-26 19:30:00')
如果我使用
reset_index()
将其重置为整数,则上述.apply()
函数可以正常工作。这是预期的行为吗?我正在使用Python 3.4和pandas 0.19.1。
重新创建DataFrame的代码:
s = '''
TS,P,N,ID,Year,Month
2016-06-26 19:30:00,263.600006,5.4,5,2016,6
2016-06-26 20:00:00,404.700012,5.6,5,2016,6
2016-06-26 21:10:00,438.600006,6.0,5,2016,6
2016-06-26 21:20:00,218.600006,5.6,5,2016,6
2016-07-02 16:10:00,285.300049,15.1,5,2016,7
'''
df = pd.read_csv(pd.compat.StringIO(s), index_col=0, parse_dates=True)
loc
、iloc
等返回浮点数,即使列类型为整数也是如此。这可能是一个bug。您可以将row['Year']
更改为int(row['Year'])
作为解决方法(当然,月份也是一样)。或者您可以轻松地使用df.index.days_in_month
。 - ayhanint
数据类型测试给定的数据集时,它返回了适当的值。但是,当其中一个更改为float
时,它强制将所有列转换为浮点类型(即使提供reduce=False
也没有帮助)。这就是为什么它要求以int
作为输入的原因。此外,这不仅适用于datetime
,即整数索引也显示类似的行为。 - Nickil Maveli