用熊猫打开德国csv文件的最佳方式是什么?
我有一个包含以下列的德语csv文件:
我的预期产出是:
Umlaute Zahlen
Datum
2020-01-01 Rüdiger 1000000.11
2020-01-02 Günther 12.34
2020-01-03 Jürgen 567.89
下面提供了示例数据(见文件)。
df = pd.read_csv('german_csv_test.csv')
这将引发一个UnicodeDecodeError
:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfc in position 12: invalid start byte
df = pd.read_csv('german_csv_test.csv', sep=';', encoding='latin1')
这不会引发错误,但与我期望的输出相差甚远:
Datum Umlaute Zahlen
0 01.01.2020 Rüdiger 1.000.000,11
1 02.01.2020 Günther 12,34
2 03.01.2020 Jürgen 567,89
df = pd.read_csv('german_csv_test.csv', sep=';', encoding='latin1')
df['Datum'] = pd.to_datetime(df['Datum'])
df = df.set_index('Datum')
df['Zahlen'] = pd.to_numeric(df['Zahlen'])
现在,我有四行代码,但仍然不起作用。最后一行抛出错误ValueError:无法分析位置0处的字符串“1.000.000,11”
。如果我把最后一行注释掉,它就行了。但是日期仍然是错误的,因为日期和月份是相互转换的。
Umlaute Zahlen
Datum
2020-01-01 Rüdiger 1.000.000,11
2020-02-01 Günther 12,34
2020-03-01 Jürgen 567,89
我的文件german_csv_test.csv
看起来像这样:
Datum;Umlaute;Zahlen
01.01.2020;Rüdiger; 1.000.000,11
02.01.2020;Günther; 12,34
03.01.2020;Jürgen; 567,89
它被编码为“cp1252”。我用“CSV(MS-DOS)”选项将其保存在Windows上。
converters = {'Datum': lambda x: pd.to_datetime(x, format='%d.%m.%Y')}
df1 = pd.read_csv('german_csv_test.csv', sep=';', thousands='.', decimal=',', encoding='latin1',
converters=converters, index_col='Datum')
德国csv文件很棘手,因为它们乍看起来很好,但是数据类型都是错误的,月份和日期之间的切换可能会令人沮丧。上述参数适用于广泛的欧洲csv文件。在下面我将解释每个参数。
几乎所有德语csv文件都使用分号“;”作为分离字符。这对大多数欧洲国家都适用。您可能会认为这是错误的,因为csv表示“逗号分隔的值”。但这与对错无关,而是与传统有关。你可以说csv代表“字符分隔值”。
此外,大多数欧洲国家使用点对千进行分组,用逗号分隔小数。这篇伟大的文章解释了原因。
如果您在Python文档中查找德语编码,您将看到德语的编解码器“cp273”。它很少被使用。你应该对西欧的“拉丁语1”没问题。使用此编解码器得益于CPython的内部优化:
CPython实现细节:一些常见的编码可以绕过编解码器查找机制来提高性能。这些优化机会只被CPython识别为一组有限的(不区分大小写)别名: utf-8、utf8、拉丁-1、拉丁-1、iso-8859-1、iso8859-1、mbcs(仅限视窗)、ascii、us-ascii、utf-16、utf16、utf-32、utf32和同样使用下划线而不是破折号。对这些编码使用替代别名可能会导致较慢的执行。
要进一步阅读,请查阅这篇文章和乔尔·斯波尔斯基的博客。
转换器被大多数熊猫用户低估了。它看起来像一个简单问题的复杂解决方案。为什么不使用pd.to_datetime()
读取文件后?您希望将输入与处理数据分开(请参阅首次公开募股模型)。
我见过(写过)很多次这样的事情:
df = pd.read_csv('test.csv')
df['Revenue'] = df['Price'] * df['Quantity'] # I don't have to clean up all columns. I just need the revenue.
(...) # Some other code
# Plotting revenue
df['Revenue'] = df['Revenue'] / 1000
df['Date'] = pd.to_datetime(df['Date']) # Oh, the dates are still strings. I can fix this easily before plotting.
在下一次迭代中,您可以移动pd。到_datetime()
up。但也许不是。这可能会导致一些意想不到的行为。在编写此类代码两个月后,您只看到一长串非结构化操作,您会认为“这是一团乱”
有几种方法可以清理数据帧。但是为什么不使用内置转换器呢?如果为数据帧的每一列定义dtypes
和converter
,则不必回头看(生气)。打电话给pd后,你站在了坚实的基础上。读取\u csv()
。
请注意,转换器仅接受功能。这就是我在转换器中使用lambda函数的原因。否则,我无法指定format参数。
在文档和本文中了解有关转换器的更多信息
这只是定义了索引列。它很方便,因为替代df=df.set_index('Data')
不是那么漂亮。此外,它有助于像转换器一样将输入块与数据处理分开。
我运行了以下脚本(https://github.com/FXCMAPI/FXCMTickData/blob/master/TickData34.py)并在末尾添加以下行以下载文件: 然后,我尝试使用pandas打开文件,如下所示: 然而,我得到的是: 为什么数据框是空的? 如果我在TextEdit上打开文件,前几行实际上如下所示:
我试图从特定文件路径的文本文件导入数据,但我得到错误 我的问题是,无论如何,我可以将“utf-8”编码应用于所有最终必须打开的文本文件(大约20个其他文件),以便防止上述错误? 代码: 如果我做错了什么,我也愿意接受任何建议。 先谢谢你。
有什么能帮上忙的吗?
我保存了一个熊猫数据框作为CSV使用 但是当我读到它在使用 我收到一条错误消息说 UnicodeDecodeError:“utf-8”编解码器无法解码位置158处的字节0xbf:无效的开始字节 我已经尝试通过使用打开csv文件来强制读取时的编码为utf-8 真的卡住了,有人能帮忙吗? 非常感谢
我只想从csv文件中返回这些特定列,并将其写入新的csv文件? 我该怎么做 到目前为止,我可以读取数据!!但不知道怎么写 绝对PYTHON BEGGINER警报
我试图加载一个csv文件内基于熊猫的数据帧。我使用了以下导入。 没有找到文件是抛出错误,回溯如下: ()中的FileNotFoundError回溯(最近一次调用)---- c:\users\saish\appdata\local\programs\python\python35-32\lib\site packages\pandas\io\parsers。语法分析器中的py\u f(文件路径或缓冲