如何在Pandas DataFrame中的apply()中使用DateTimeIndex作为命名函数的输入

时间:2018-05-14 09:58:39

标签: python-3.x pandas

我有一个由15分钟间隔组成的DateTimeIndex。

我也有两种我想要在整个数据框中应用的方法。该函数的关键是获取特定日期是否为工作日。

他们是:

def weekend(datum):
    if (datum.weekday() == 5) or (datum.weekday() == 6):
        return "Weekend"
    else:
        return "Working day"
 # written with being fed the DateTimeIndex in mind


def weekendfromnumber(number):
    if (number == 5) or (number == 6):
        return "Weekend"
    else:
        return "Working day"
# written with being fed the integer of the intermediate columng weekday in mind

我希望通过直接使用DateTimeIndex来应用第一个函数,如下所示:

df15['Type of day'] = df15.index.apply(weekend)

但是我收到了错误:

AttributeError: 'DatetimeIndex' object has no attribute 'apply'

如果我使用第二个函数,如:

df15['Type of day'] = df15.weekday.apply(weekendfromnumber)

我得到了我想要的效果,但代价是需要创建名为weekday的中间列:

df15['weekday'] = df15.index.weekday

由于我不想要一个中间列,我认为做了类似的事情:

df15['Type of day'] = df15.index.weekday.apply(weekendfromnumber) 

会起作用,但我会得到错误

AttributeError: 'numpy.ndarray' object has no attribute 'apply'

因此,首要问题是:

如何使用DateTimeIndex中已有的数据并使用apply()将其提供给自定义函数?

1 个答案:

答案 0 :(得分:1)

您可以为日期时间索引创建一个临时pd.Series,但为什么不使用np.where,因为它在这里要快得多:

df15['Type of day'] = np.where(df15.index.weekday > 5, "Weekend", "Working Day")

如果您的功能很复杂且无法使用np.where,请先致电to_series()

df15['Type of day'] = df15.index.to_series().apply(weekend)

<强>时序:

使用包含100行和一列的虚拟数据框进行测试:

df = pd.DataFrame(np.random.rand(100,1), 
                  index=pd.DatetimeIndex(freq='D', 
                                         start='2017-01-01',
                                         periods=100))

In [1]: %timeit df.index.to_series().apply(weekend)
1.11 ms ± 127 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [2]: %timeit np.where(df.index.weekday > 5, "Weekend", "Weekday")
192 µs ± 45.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)