如何使用日期时间索引作为跨熊猫数据帧的 apply() 中命名函数的输入



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

我还以 2 种方式编写了相同的函数,我想将其应用于整个数据框。该函数的重点是获取特定日期是否为工作日。

他们在这里:

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

我想通过直接向它提供日期时间索引来应用第一个函数,如:

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(( 将其提供给自定义函数?

您可以为日期时间索引创建一个临时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)

最新更新