我有一个在Pandas中的Dataframe,其中包含字母和两个日期作为列。我想使用shift()计算前一行的两个日期之间的工作日,只要Letter值相同(使用groupby())。我以前是用apply()来做这个的。这个方法在我传入某些数据时有效,但其中一个日期缺失。我将所有内容移动到一个函数中,并使用try/except子句处理缺失的值,但现在我的函数对所有值都返回NaN。似乎日期的None值会影响每次调用函数,而我认为它只会在groupby()中的Letter是A时才会这样做。
import pandas as pd
from datetime import datetime
import numpy as np
def business_days(x):
try:
return pd.DataFrame(np.busday_count(x['First Date'].tolist(), x['Last Date'].tolist())).shift().reset_index(drop=True)
except ValueError:
return None
df = pd.DataFrame(data=[['A', datetime(2016, 1, 7), None],
['A', datetime(2016, 3, 1), datetime(2016, 3, 8)],
['B', datetime(2016, 5, 1), datetime(2016, 5, 10)],
['B', datetime(2016, 6, 5), datetime(2016, 6, 7)]],
columns=['Letter', 'First Date', 'Last Date'])
df['First Date'] = df['First Date'].apply(lambda x: x.to_datetime().date())
df['Last Date'] = df['Last Date'].apply(lambda x: x.to_datetime().date())
df['Gap'] = df.groupby('Letter').apply(business_days)
print df
实际输出:
Letter First Date Last Date Gap
0 A 2016-01-07 NaT NaN
1 A 2016-03-01 2016-03-08 NaN
2 B 2016-05-01 2016-05-10 NaN
3 B 2016-06-05 2016-06-07 NaN
期望输出:
Letter First Day Last Day Gap
0 A 2016-01-07 NAT NAN
1 A 2016-03-01 2016-03-08 NAN
2 B 2016-05-01 2016-05-10 NAN
3 B 2016-06-05 2016-06-07 7
NaT
,busday_count函数会引发ValueError并返回None。您希望整个Letter组的Gap值为NaN还是希望计算非NaT行的工作日? - unutbu