parse_dates失败时,熊猫删除行

时间:2018-09-07 13:11:04

标签: python pandas

我遇到了一个问题,我以为Pandas的聪明人已经解决了,但是我似乎什么也找不到,所以我在这里。

我遇到的问题来自一些不良数据,我希望熊猫能够在读取时进行过滤。 数据如下:

Station;Datum;Zeit;Lufttemperatur;Relative Feuchte;Wettersymbol;Windgeschwindigkeit;Windrichtung
9;12.11.2016;08:04;-1.81;86;;;
9;12.11.2016;08:19;-1.66;85.5;;;
9;²;08:34;-1.71;85.6;;;
9;12.11.2016;08:49;-1.91;87.7;;;
9;12.11.2016;09:04;-1.66;86.6;;;

(这使用的是ISO-8859-1字符集,在UTF-8等中看起来有所不同。)我想将第二列作为日期读取,所以自然地,我使用了

data = pandas.read_csv(file, sep=";", encoding="ISO-8859-1", parse_dates=["Datum"], 
                       date_parser=lambda x: pandas.to_datetime(x, format="%d.%m.%Y"))

给了

ValueError: time data '²' does not match format '%d.%m.%Y' (match)

尽管pandas.read_csv具有输入参数 error_bad_lines ,这似乎对我的情况有所帮助,但看来它所做的只是过滤掉没有正确列数的行。现在,我可以用许多不同的方式过滤掉这一行,据我所知,所有这些都需要首先加载所有数据,过滤掉行,然后将列转换为日期时间对象,但是我宁愿在阅读时这样做在文件中。似乎有可能,因为当我省略date_parser时,文件被成功解析,并且奇怪的字符被保留了下来(尽管稍后在执行日期时间指令时可能会出现问题)。

大熊猫是否有一种方法可以过滤掉读取文件时(而不是在后期处理期间)不能使用date_parser的行?

1 个答案:

答案 0 :(得分:1)

您要在pandas.to_datetime中使用errors参数

date_parser=lambda x: pd.to_datetime(x, errors="coerce")

file = "file.csv"

data = pd.read_csv(
    file, sep=";", encoding="ISO-8859-1", parse_dates=["Datum"],
    date_parser=lambda x: pd.to_datetime(x, errors="coerce")
)

data

   Station      Datum   Zeit  Lufttemperatur  Relative Feuchte  Wettersymbol  Windgeschwindigkeit  Windrichtung
0        9 2016-12-11  08:04           -1.81              86.0           NaN                  NaN           NaN
1        9 2016-12-11  08:19           -1.66              85.5           NaN                  NaN           NaN
2        9        NaT  08:34           -1.71              85.6           NaN                  NaN           NaN
3        9 2016-12-11  08:49           -1.91              87.7           NaN                  NaN           NaN
4        9 2016-12-11  09:04           -1.66              86.6           NaN                  NaN           NaN