Python 熊猫:重新索引后访问时间戳属性

Python 熊猫:重新索引后访问时间戳属性,python,pandas,time-series,Python,Pandas,Time Series,在使用pd.date\u 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

在使用pd.date\u 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的预期结果:

现在,如果要使用“应用”指定新列,请使用:

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的内容:

看起来时间戳正在传递给Name,我不知道如何访问它。当我查看row.index时,我得到:

这种行为的原因是什么?

问题是,当对参数axis=1的数据帧使用apply函数时,数据帧的每一行都作为一个序列传递给函数。看

因此,在year_attrib函数中实际发生的是,row.index将返回该行的索引,即数据帧的列

In [5]: df.columns
Out[5]: Index(['data'], dtype='object')
因此,使用row.index.month时将引发AttributeError

如果确实要使用此函数获取所需内容,请改用row.name.month

但是仍然建议使用矢量化方式,如:

In [10]: df.loc[df.index.month>2, 'year_attrib'] = df[df.index.month>2].index.year + 11

In [11]: df.loc[df.index.month<=2, 'year_attrib'] = df[df.index.month>2].index.year + 15

In [12]: df
Out[12]:
            data  year_attrib
2004-03-01    93         2015
2004-03-02    48         2015
2004-03-03    88         2015
2004-03-04    44         2015
2004-03-05    11         2015
2004-03-06     4         2015
2004-03-07    70         2015

df['year\u attrib']=np.wheredf.index.month>2,22,11您不需要函数this@anky_91啊,我说得太简单了。我已经修改为func,返回一个基于row.index.year相同np的值,其中df.index.month>2,df.index.year+11,df.index.year+15感谢您的解释。我知道每一行都是作为一个系列传递的,这就是为什么我开始研究系列df.iloc[0]。我试着寻找row.Name,而不是您指出的row.Name。当您查看printrow时,它有点误导,其中n在名称中大写。我现在对apply的工作原理有了更好的了解。干杯是的,你做得对。我误解了问题的最后一部分:-。顺便说一句,您可以使用dirrow查看如何访问名称meyhod。刚刚尝试运行我得到的df.loc行:ValueError:shape mismatch:shape 126的值数组,无法广播到shape 66的索引结果,。从您的示例的外观来看,您在重新索引df之前显示了它。呃,是的,我忘了。请参阅修改后的答案。
row.index
Out[34]: Index(['data'], dtype='object')
In [5]: df.columns
Out[5]: Index(['data'], dtype='object')
In [10]: df.loc[df.index.month>2, 'year_attrib'] = df[df.index.month>2].index.year + 11

In [11]: df.loc[df.index.month<=2, 'year_attrib'] = df[df.index.month>2].index.year + 15

In [12]: df
Out[12]:
            data  year_attrib
2004-03-01    93         2015
2004-03-02    48         2015
2004-03-03    88         2015
2004-03-04    44         2015
2004-03-05    11         2015
2004-03-06     4         2015
2004-03-07    70         2015