我有一个由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()将其提供给自定义函数?
答案 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)