使用pd.date_range
重新索引数据帧后,我难以理解时间戳会发生什么。如果我有以下示例,其中使用pd.DataFrame.reindex
创建更长的时间序列:
import pandas as pd
import numpy as np
idx_inital = pd.date_range('2004-03-01','2004-05-05')
df = pd.DataFrame(index = idx_inital, data={'data': np.random.randint(0,100,idx_inital.size)})
idx_new = pd.date_range('2004-01-01','2004-05-05')
df= df.reindex(idx_new, fill_value = 0)
返回分配了所有数据0
的预期结果:
data
2004-01-01 0
2004-01-02 0
2004-01-03 0
2004-01-04 0
2004-01-05 0
现在,如果我要使用apply来使用以下方法分配新列:
def year_attrib(row):
if row.index.month >2:
result = row.index.year + 11
else:
result = row.index.year + 15
return result
df['year_attrib'] = df.apply(lambda x: year_attrib(x), axis=1)
我遇到了错误:
AttributeError: ("'Index' object has no attribute 'month'", 'occurred at index 2004-01-01 00:00:00')
如果我使用以下方法检查每行要传递给year_attrib
的内容:
row = df.iloc[0]
row
Out[32]:
data 0
Name: 2004-01-01 00:00:00, dtype: int32
好像时间戳是传递给Name
的,我不知道如何访问它。当我看着row.index
时会得到:
row.index
Out[34]: Index(['data'], dtype='object')
此行为的原因是什么?
答案 0 :(得分:1)
问题是,当对参数为apply
的{{1}}使用DataFrame
函数时,数据帧的每一行都以axis=1
的形式传递给函数。参见doc of pandas。
因此,Series
函数中实际发生的事情是,year_attrib
将返回row.index
的索引,即数据帧的row
。
column
因此,在使用In [5]: df.columns
Out[5]: Index(['data'], dtype='object')
时将引发AttributeError
。
如果您真的想使用此功能来获取所需的内容,请改用row.index.month
。
但是仍然建议使用row.name.month
的方式,例如:
vectorized