
NaT
暂时忽略s,请注意,np.busday_count
可以df
在 应用 之前 对整列进行计算groupby
。这将节省时间,因为它将np.busday_count
一个的调用替换为的许多调用(每个组一个)np.busday_count
。通常,对大型数组进行一个函数调用要比对小型数组进行许多函数调用要快。要处理
NaT
s,您可以pd.notnull
用来标识具有NaT
s的行并屏蔽First Date
s和Last Date
s,以便仅将有效日期发送到np.busday_count
。然后,您可以NaN
为日期中有NaT
s的行填写。在计算完所有工作日计数之后,我们要做的只是分组
Letter
并将值向下 移动 一。可以用完成groupby/transform('shift')。
import datetime as DTimport numpy as npimport pandas as pddef business_days(start, end): mask = pd.notnull(start) & pd.notnull(end) start = start.values.astype('datetime64[D]')[mask] end = end.values.astype('datetime64[D]')[mask] result = np.empty(len(mask), dtype=float) result[mask] = np.busday_count(start, end) result[~mask] = np.nan return resultdf = pd.Dataframe(data=[['A', DT.datetime(2016, 1, 7), None], ['A', DT.datetime(2016, 3, 1), DT.datetime(2016, 3, 8)], ['B', DT.datetime(2016, 5, 1), DT.datetime(2016, 5, 10)], ['B', DT.datetime(2016, 6, 5), DT.datetime(2016, 6, 7)]], columns=['Letter', 'First Date', 'Last Date'])df['Gap'] = business_days(df['First Date'], df['Last Date'])print(df)# Letter First Date Last Date Gap# 0 A 2016-01-07 NaT NaN# 1 A 2016-03-01 2016-03-08 5.0# 2 B 2016-05-01 2016-05-10 6.0# 3 B 2016-06-05 2016-06-07 1.0df['Gap'] = df.groupby('Letter')['Gap'].transform('shift')print(df)版画
Letter First Date Last Date Gap0 A 2016-01-07 NaT NaN1 A 2016-03-01 2016-03-08 NaN2 B 2016-05-01 2016-05-10 NaN3 B 2016-06-05 2016-06-07 6.0
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)