尝试使用除了不使用datetime对象的块?

时间:2016-09-05 03:17:33

标签: python datetime pandas

我有一个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它也没有... ...

2 个答案:

答案 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]