1

我有一个字符串date。我知道如何将它转换为 datetime.datetime 对象(当没有丢失时!!!)但问题是我有一些缺失值。而我做不到。

假设 input_date 是原始日期变量,它是字符串。我想生成 input_date_fmt 变量,它将是 datetime.datetime 。我正在尝试运行以下

DF['input_date_fmt'] = np.array([datetime.datetime.strptime(x, "%m/%d/%Y").date()
                                 for x in DF['input_date']])

但错误是

ValueError: time data 'nan' does not match format '%m/%d/%Y'

有人可以帮忙吗?

4

2 回答 2

2

如果您的数据框中有字符串值“nan”:

>>> df = pd.DataFrame({'input_date':['01/01/2003', '02/29/2012', 'nan', '03/01/1995']})
>>> df
   input_date
0  01/01/2003
1  02/29/2012
2         nan
3  03/01/1995

您可以在转换为日期之前将其转换为 NaN:

>>> df.ix[df['input_date'] == 'nan', 'input_date'] = np.NaN
>>> df
   input_date
0  01/01/2003
1  02/29/2012
2         NaN
3  03/01/1995

然后你就可以进行转换了。但更简单的方法是使用矢量化操作to_datetime将字符串转换为日期时间:

>>> df = pd.DataFrame({'input_date':['01/01/2003', '02/29/2012', 'nan', '03/01/1995']})
>>> pd.to_datetime(df['input_date'])
0   2003-01-01 00:00:00
1   2012-02-29 00:00:00
2                   NaT
3   1995-03-01 00:00:00
于 2013-11-03T15:03:05.260 回答
0

您可以使用正则表达式仅解析有效日期:

DF['input_date_fmt'] = np.array([datetime.datetime.strptime(x, "%m/%d/%Y").date()
                             for x in DF['input_date']] if re.match('(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/(19|20)\d\d', x))

但我同意 Satoru.Logic。您将如何处理无效值。

于 2013-11-03T05:31:30.313 回答