我有三列带有日期,一个Begin
列和两个End
列。我想使用len
中的bdate_range
来查找Begin
和End
之间的工作日数。但是,在NaT
中使用bdate_range
作为参数会导致其引发错误。
test = pd.DataFrame({'Begin': ['2014-06-11', '2014-08-05', '2014-09-21', '2014-09-21', '2014-09-21', '-'],
'End1': ['2014-06-12', '2014-08-31', 'NaT', '2014-09-30', '2014-09-28', '-'],
'End2': ['2014-06-14', '-', '2014-09-30', '-', '2014-09-28', '2014-12-15']})
test['Begin'] = pd.to_datetime(test['Begin'], dayfirst=False, yearfirst=False, errors='coerce', exact=False)
test['End1'] = pd.to_datetime(test['End1'], dayfirst=False, yearfirst=False, errors='coerce', exact=False)
test['End2'] = pd.to_datetime(test['End2'], dayfirst=False, yearfirst=False, errors='coerce', exact=False)
创建此表:
Begin End1 End2 0 2014-06-11 2014-06-12 2014-06-14 1 2014-08-05 2014-08-31 NaT 2 2014-09-21 NaT 2014-09-30 3 2014-09-21 2014-09-30 NaT 4 2014-09-21 2014-09-28 2014-09-28 5 NaT NaT 2014-12-15
因此,在这些数据框中,我尝试将bdate_range
与len
test['bdate_range'] = [len(pd.bdate_range(x,y))for x,y in zip(test['Begin'],test['End1'])]
.
.
.
ValueError: Neither `start` nor `end` can be NaT
fillna
不太好...
test = test.fillna(pd.Timedelta(0))
test['bdate_range'] = [len(pd.bdate_range(x,y))for x,y in zip(test['Begin'],test['End1'])]
.
.
.
TypeError: Cannot convert input [0 days 00:00:00] of type <class 'pandas._libs.tslibs.timedeltas.Timedelta'> to Timestamp
理想的结果是再增加两列,每行再增加两个字段:
Begin End1 End2 Begin-End1_bdate Begin-End2_bdate 0 2014-06-11 2014-06-12 2014-06-14 1 2 1 2014-08-05 2014-08-31 NaT 18 NaN 2 2014-09-21 NaT 2014-09-30 NaN 7 3 2014-09-21 2014-09-30 NaT 7 NaN 4 2014-09-21 2014-09-28 2014-09-28 5 5 5 NaT NaT 2014-12-15 NaN NaN
有主意吗?
答案 0 :(得分:2)
您需要将函数(在本例中为len
的{{1}})仅应用于bdate_range
和Begin
字段都不为{{1 }}。您可以将默认End
字段设置为null
,然后使用range
切成仅特定的行。请阅读that function上的这篇较长的帖子。
null