【发布时间】:2016-06-01 18:48:13
【问题描述】:
我在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
【问题讨论】:
-
在您当前的代码中,如果 Letter 组在一行中有一个
NaT,则 busday_count 函数会引发 ValueError 并返回 None。您希望整个 Letter 组的 Gap 值为 NaN,还是希望计算非 NaT 行的工作日? -
@unutbu 仅适用于非 NaT 行
标签: python python-2.7 pandas