2

我有一个包含日期字段作为文本的数据框。

我使用以下方法将日期字段转换为日期时间对象:

df['date'] = pd.to_datetime(df['date'])

正在做:

df['日期']

产生这样的东西:

0    2012-06-28 09:36:21
1    2013-05-21 14:52:57
2    2011-10-14 16:31:34
3    2011-11-11 12:51:13
4    2013-02-07 15:33:22
5    2013-01-02 14:40:08
6    2013-06-24 14:49:40
7    2013-07-15 15:29:26
8    2011-11-04 12:17:32
9    2013-04-29 17:31:43
10   2013-06-24 15:00:06
11   2012-10-22 18:23:53
12                   NaT
13                   NaT
14   2011-12-13 10:06:18

现在我将日期时间对象转换为日期对象:

df['date'].apply(try_convert_date)

(请参阅下面的 try_to_convert 是如何定义的)。我得到:

0       2012-06-28
1       2013-05-21
2       2011-10-14
3       2011-11-11
4       2013-02-07
5       2013-01-02
6       2013-06-24
7       2013-07-15
8       2011-11-04
9       2013-04-29
10      2013-06-24
11      2012-10-22
12    0001-255-255
13    0001-255-255
14      2011-12-13

其中“NaT”值已转换为“0001-255-255”。如何避免这种情况并在这些单元格中保留“NA”?

提前致谢

def try_convert_date(obj):

    try:
        return obj.date()
    except: #AttributeError:
        return 'NA'
4

1 回答 1

3

问题是它pd.NaT.date()不会引发错误,它会返回datetime.date(1, 255, 255),因此永远不会到达捕获异常的代码部分。您必须检查该值是否为pd.NaT,在这种情况下返回“NA”。在所有其他情况下,您可以安全地返回obj.date(),因为该列具有datetime64dtype。

def try_convert(obj):
    if obj is pd.NaT:
        return 'NA'
    else:
        return obj.date()

n [17]: s.apply(try_convert)
Out[17]:
0     2012-06-28
1     2013-05-21
2     2011-10-14
3     2011-11-11
4     2013-02-07
5     2013-01-02
6     2013-06-24
7     2013-07-15
8     2011-11-04
9     2013-04-29
10    2013-06-24
11    2012-10-22
12            NA
13            NA
14    2011-12-13
Name: 1_2, dtype: object
于 2013-08-13T15:04:36.997 回答