使用具有空值(NaN,NaT)的“ bdate_range”

时间:2019-05-02 16:56:35

标签: pandas

我有三列带有日期,一个Begin列和两个End列。我想使用len中的bdate_range来查找BeginEnd之间的工作日数。但是,在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_rangelen

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

所需结果

理想的结果是再增加两列,每行再增加两个字段:

  1. 开始-End1在工作日中的差异,如果列的NaT结果的值为NaN / NaT
  2. 开始-End2在工作日中的差异(如果值为NaT,则结果为NaT / NaN –
    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

有主意吗?

1 个答案:

答案 0 :(得分:2)

您需要将函数(在本例中为len的{​​{1}})仅应用于bdate_rangeBegin字段都不为{{1 }}。您可以将默认End字段设置为null,然后使用range切成仅特定的行。请阅读that function上的这篇较长的帖子。

null