将文本日期转换为日期,然后保持NA值

时间:2013-08-13 14:45:48

标签: python pandas

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

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

  

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 [ '日期']。应用(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'

1 个答案:

答案 0 :(得分:3)

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

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