当前位置: 首页 > 知识库问答 >
问题:

如何用熊猫打开德国csv文件?

杨景山
2023-03-14

用熊猫打开德国csv文件的最佳方式是什么?

我有一个包含以下列的德语csv文件:

  • 基准:格式为“DD.MM”的日期。YYYY'
  • Umlaute:带有德语特有字符的德语名称
  • 扎伦:格式为“000.000,00”的数字

我的预期产出是:

            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上。

共有1个答案

洪高阳
2023-03-14
    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。但也许不是。这可能会导致一些意想不到的行为。在编写此类代码两个月后,您只看到一长串非结构化操作,您会认为“这是一团乱”

有几种方法可以清理数据帧。但是为什么不使用内置转换器呢?如果为数据帧的每一列定义dtypesconverter,则不必回头看(生气)。打电话给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(文件路径或缓冲