我遇到了一个问题,我以为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的行?
答案 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