我有一个字符串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'
有人可以帮忙吗?
答案 0 :(得分: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将字符串转换为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
答案 1 :(得分: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。你打算用无效的价值做什么。