使用skipna在datetime64中找不到min

时间:2013-12-12 16:20:26

标签: python datetime pandas nan min

我想在candidate_id中找到startdate和enddate中的最小日期,但是skipna.startdate和enddate列是datetime64格式。保证数据至少有一个startdate或enddate不为null。而且我也不想使用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 

谢谢!

2 个答案:

答案 0 :(得分:0)

似乎是一个错误,因为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]

答案 1 :(得分:0)

这只是昨天在主人身上修好的(将包含在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'