这与这里的问题非常相似,但我想知道大熊猫是否有一种干净的方式让工作日意识到TimedeltaIndex?最终,我试图获取DatetimeIndex和Timestamp之间的工作日数(没有假日日历).根据引用的问题,这样的事情是有效的
import pandas as pd
import numpy as np
drg = pd.date_range('2015-07-31', '2015-08-05', freq='B')
A = [d.date() for d in drg]
B = pd.Timestamp('2015-08-05', 'B').date()
np.busday_count(A, B)
Run Code Online (Sandbox Code Playgroud)
这使
array([3, 2, 1, 0], dtype=int64)
Run Code Online (Sandbox Code Playgroud)
但这似乎有点笨拙.如果我尝试类似的东西
drg - pd.Timestamp('2015-08-05', 'B')
Run Code Online (Sandbox Code Playgroud)
我得到了一个TimedeltaIndex,但工作日频率被取消了
TimedeltaIndex(['-5 days', '-2 days', '-1 days', '0 days'], dtype='timedelta64[ns]', freq=None)
Run Code Online (Sandbox Code Playgroud)
只是想知道是否有更优雅的方式来解决这个问题.
unu*_*tbu 11
TimedeltaIndexes表示固定的时间跨度.可以将它们添加到Pandas时间戳中以按固定金额递增它们.他们的行为决不取决于时间戳是否是营业日.TimedeltaIndex本身绝不是工作日.
由于最终目标是计算DatetimeIndex和Timestamp之间的天数,因此我会查看另一个方向,而不是转换为TimedeltaIndex.
不幸的是,日期计算相当复杂,并且已经涌现出许多数据结构来处理它们 - Python datetime.dates,datetime.datetimes,Pandas Timestamps,NumPy datetime64.
他们每个人都有自己的优势,但没有一个人能够胜任各种目的.为了利用它们的优势,有时需要在这些类型之间进行转换.
要使用,np.busday_count您需要将DatetimeIndex和Timestamp转换为某种类型的np.busday_count理解.你称之为kludginess的是转换类型所需的代码.假设我们想要使用,没有办法解决这个问题np.busday_count- 我知道这项工作没有比这更好的工具了np.busday_count.
所以,虽然我认为计算工作日的方式比你提出的方法更简洁,但是有一种更为高效的方法:转换为datetime64[D]'s而不是Python datetime.date对象:
import pandas as pd
import numpy as np
drg = pd.date_range('2000-07-31', '2015-08-05', freq='B')
timestamp = pd.Timestamp('2015-08-05', 'B')
def using_astype(drg, timestamp):
A = drg.values.astype('<M8[D]')
B = timestamp.asm8.astype('<M8[D]')
return np.busday_count(A, B)
def using_datetimes(drg, timestamp):
A = [d.date() for d in drg]
B = pd.Timestamp('2015-08-05', 'B').date()
return np.busday_count(A, B)
Run Code Online (Sandbox Code Playgroud)
对于上面的示例,这个速度快了100倍(len(drg)接近4000):
In [88]: %timeit using_astype(drg, timestamp)
10000 loops, best of 3: 95.4 µs per loop
In [89]: %timeit using_datetimes(drg, timestamp)
100 loops, best of 3: 10.3 ms per loop
Run Code Online (Sandbox Code Playgroud)
np.busday_countdatetime64[D]无论如何将其输入转换为s,因此避免这种与datetime.dates的额外转换更有效.
| 归档时间: |
|
| 查看次数: |
3801 次 |
| 最近记录: |