【问题标题】:failed to find min in datetime64 with skipna使用 skipna 在 datetime64 中找不到 min
【发布时间】:2013-12-31 04:01:53
【问题描述】:

我想在candidate_id 中的startdate 和enddate 中找到最小日期,但是skipna。startdate 和enddate 列是datetime64 格式。保证数据至少 startdate 或 enddate 之一不应为空。而且我不想使用fillna。

>>> selected= dat[((pd.notnull(dat['startdate'])) | (pd.notnull(dat['enddate'])))][['candidate_id','startdate','enddate']]
>>> f=selected[200:206]
>>> f
     candidate_id           startdate             enddate
239         10038 2001-01-01 00:00:00 2008-01-01 00:00:00
240         10038 1994-01-01 00:00:00 2001-01-01 00:00:00
241         10038 1992-01-01 00:00:00 1994-01-01 00:00:00
242          1003 2006-01-01 00:00:00 2013-06-12 00:00:00
243          1003 1985-01-01 00:00:00 2005-07-01 00:00:00
244         10040 1994-01-01 00:00:00                 NaT
>>> k=f.groupby('candidate_id')[['startdate','enddate']].min()
>>> k
                       startdate              enddate
candidate_id                                         
1003         1985-01-01 00:00:00  2005-07-01 00:00:00
10038        1992-01-01 00:00:00  1994-01-01 00:00:00
10040        1994-01-01 00:00:00                  NaN

我试过了:

>>> k.min(axis=1, skipna=True)
candidate_id
1003           NaN
10038          NaN
10040          NaN

我想要的是:

candidate_id
1003           1985-01-01 00:00:00
10038          1992-01-01 00:00:00
10040          1994-01-01 00:00:00 

谢谢!

【问题讨论】:

    标签: python datetime pandas nan min


    【解决方案1】:

    看起来像一个错误,导致min 你的k.enddate 是object_type(参见NaN 而不是NaT):

    >>> k.enddate
    candidate_id
    1003            2005-07-01 00:00:00
    10038           1994-01-01 00:00:00
    10040                           NaN
    Name: enddate, dtype: object
    

    以下将作为一种解决方法:

    >>> k.enddate = pd.to_datetime(k.enddate)
    >>> k.min(axis=1, skipna=True)
    candidate_id
    1003           1985-01-01 00:00:00
    10038          1992-01-01 00:00:00
    10040          1994-01-01 00:00:00
    dtype: datetime64[ns]
    

    【讨论】:

      【解决方案2】:

      这是昨天在 master 中修复的(将包含在 0.13 中,即将发布)。在 datetime64[ns] 和缺失值的情况下,Groupby 没有返回正确的 dtypes。

      In [25]: df
      Out[25]: 
                 start_date            end_date  candidate_id
      0 2001-01-01 00:00:00 2008-01-01 00:00:00         10038
      1 1994-01-01 00:00:00 2001-01-01 00:00:00         10038
      2 1992-01-01 00:00:00 1994-01-01 00:00:00         10038
      3 2006-01-01 00:00:00 2013-06-12 00:00:00          1003
      4 1985-01-01 00:00:00 2005-07-01 00:00:00          1003
      5 1994-01-01 00:00:00                 NaT         10040
      
      [6 rows x 3 columns]
      
      In [26]: df.dtypes
      Out[26]: 
      start_date      datetime64[ns]
      end_date        datetime64[ns]
      candidate_id             int64
      dtype: object
      
      In [28]: df.groupby('candidate_id')[['start_date','end_date']].min()
      Out[28]: 
                            start_date            end_date
      candidate_id                                        
      1003         1985-01-01 00:00:00 2005-07-01 00:00:00
      10038        1992-01-01 00:00:00 1994-01-01 00:00:00
      10040        1994-01-01 00:00:00                 NaT
      
      [3 rows x 2 columns]
      
      In [29]: pd.__version__
      Out[29]: '0.13.0rc1-62-g507ffb5'
      

      【讨论】:

        猜你喜欢
        • 2018-11-21
        • 1970-01-01
        • 1970-01-01
        • 2017-02-27
        • 1970-01-01
        • 2020-05-07
        • 2016-02-14
        • 1970-01-01
        • 2021-07-13
        相关资源
        最近更新 更多