我有一个DataFrame,在一列中包含一些日期时间数据,而在其他列中包含其他任何内容。但是,有些数据搞砸了,例如:
11/11/2014 22:28 15.1
11/11/2014 22:29 16.1
11/11/2014 22:30 15.2
bollocks 10000
11/11/2014 22:32 15.4
:00
11/11/2014 22:34 15.3
我想摆脱搞砸的线条。现在,我决定用NaN值替换它们(但放弃它们也会有所帮助,只是它没有在循环中工作所以它不是问题,在下一步我可以使用{ {1}})。我使用dropna()
执行此操作,但例外情况不起作用。我的代码如下所示:
try()
但最后,我仍然得到for line in df.ix[:,"DATETIME"]:
try:
line = datetime.datetime.strptime(line,"%d/%m/%Y %H:%M")
except ValueError:
line = 'NaN'
except TypeError:
line = 'NaN'
并且错误的行不会被ValueError: time data '156004E00F455AA' does not match format '%d/%m/%Y %H:%M'
替换。这有什么不对?
(我也尝试将错误放在一行,如下所示:NaN
它也没有... ...
答案 0 :(得分:1)
pd.to_datetime
可以在将列转换为日期时将NaT
格式错误的数据设置为pd.to_datetime(df['DATETIME'], format = '%d/%m/%Y %H:%M', errors='coerce')
DATETIME
0 11/11/2014 22:28
1 11/11/2014 22:29
2 11/11/2014 22:30
3 NaT
4 11/11/2014 22:32
5 NaT
6 11/11/2014 22:34
。
/usr/php/56/bin/php
答案 1 :(得分:0)
这并不严格回答您的查询,但如果您确定所有有效日期时间字符串的格式为:"%d/%m/%Y %H:%M"
,则可以执行以下操作:
In [34]: df
Out[34]:
DATETIME VALUES
0 11/11/2014 22:28 15.1
1 11/11/2014 22:29 16.1
2 11/11/2014 22:30 15.2
3 bollocks 10000.0
4 11/11/2014 22:32 15.4
5 :00 NaN
6 11/11/2014 22:34 15.3
In [35]: df = df.replace(r'^(?!\d{2}/\d{2}/\d{4} \d{2}:\d{2}).*', np.nan, regex=True)
In [36]: df
Out[36]:
DATETIME VALUES
0 11/11/2014 22:28 15.1
1 11/11/2014 22:29 16.1
2 11/11/2014 22:30 15.2
3 NaN 10000.0
4 11/11/2014 22:32 15.4
5 NaN NaN
6 11/11/2014 22:34 15.3
In [37]: df['DATETIME'].apply(lambda x: pd.to_datetime(x, format="%d/%m/%Y %H:%M"))
Out[37]:
0 2014-11-11 22:28:00
1 2014-11-11 22:29:00
2 2014-11-11 22:30:00
3 NaT
4 2014-11-11 22:32:00
5 NaT
6 2014-11-11 22:34:00
Name: DATETIME, dtype: datetime64[ns]