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

时间:2019-07-09 14:49:22

标签: python pandas time-series

使用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')

此行为的原因是什么?

1 个答案:

答案 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