【问题标题】:Conflict between thousand separator and date format - pandas.read_csv千位分隔符和日期格式之间的冲突 - pandas.read_csv
【发布时间】:2020-08-22 22:16:04
【问题描述】:

我在使用 Python 的 read_csv 方法从 csv 文件中读取数据时遇到问题。

行格式:

'06.02.2013;544,00;2,52;3,53'

有了这个实现:

 df = pd.read_csv(filepath, sep=";", header=5, decimal=",")
 df['value'] = df['value'].astype(int)

Python 给我一个错误:invalid literal for int() with base 10: '544,00', 当我打印这个数据框对象时,我可以看到一些浮点值已被识别,而有些则没有。

                value   value1  value2
Datum                               
06.02.2013      544,00   2.52    3.53

我接下来要做的是实现一个方法(即使我的文件中没有数千个):

df = pd.read_csv(filepath, sep=";", header=5, decimal=",", thousands = ".")

然后我没有收到该错误,但结果日期是 06022013 而不是 06.02.2013

为了解决这个问题,我试过这个:

df = pd.read_csv(filepath, sep=";", header=5, dayfirst=True, decimal=",", thousands = ".", parse_dates=[0])

在这种情况下,日期格式如下:2013 年 1 月 2 日午夜。

在这一切之后,我尝试将 date_parser 添加到此方法中,如下所示:

df = pd.read_csv(filepath, sep=";", header=5, dayfirst=True, decimal=",", thousands = ".", parse_dates=[0],date_parser=lambda x: datetime.strptime(x, '%d.%m.%Y') )

但它仍然像以前一样格式化日期:2013 年 1 月 2 日,午夜。 有没有其他人遇到过这样的问题或知道如何解决?

编辑: 所以,真实数据看起来像这样(标题后的第一行):

0
1
2
3
4
Datum       value1 value2 value3 value4 value5 value6 value7 value8 value9 value10 value11 value12 value13 value14
01.03.2020    str1  str2   str3   str4   str5   str6   9,82   9,75   0,75   500,00  544,00  44,00   50,00  49,25

In [1]: df['value11'] = df['value11'].astype(int)
Out [1]: invalid literal for int() with base 10: '544,00'

另外,第一行已经发生错误。从那以后,我意识到在更改第一行后,我没有收到任何错误。修改第一行:

0
1
2
3
4
Datum      value1 value2 value3 value4 value5 value6 value7 value8 value9 value10 value11 value12 value13 value14
01.04.2020    str1  str2   str3   str4   str5   str6   36,03   5,46   84,85   23,00  64,00  41,00   59,92  -24,92

熊猫版本:1.0.2

EDIT2:

df = pd.read_csv(filepath, sep=";", header=5, decimal=",")
print(df.iloc[:,7:])

输出:

编辑3: 我发现了如何重现这个问题。 csv文件示例:

data.csv
0
1
2
3
4
Datum
Datum;value1;value2;value3;value4;value5;value6;value7;value8;value9;value10;value11;value12;value13;value14
01.03.2020;str1;str2;str3;str4;str5;str6;"9,82";"9,75";"0,75";"500,00";"544,00";"44,00";"50,00";"49,25"
01.03.2020;str1;str2;str3;str4;str5;str6;"9,72";"7,00";"27,97";"737,00";"1.123,00";"386,00";"51,03";"23,06"

提前致谢!

【问题讨论】:

  • 你用的是什么版本的熊猫?我无法重现您的错误。
  • 你为什么要设置header=5?你的标题不是在第一行吗?
  • 我用附加信息编辑了帖子,所以我删除了我以前的 cmets。是的,标题确实是 5,从 0 开始。抱歉没有提到!

标签: python-3.x pandas csv dataframe


【解决方案1】:

我已经设法解决了这个问题。

df = pd.read_csv(filepath, sep=";", header=5, decimal=",", thousands = ".", parse_dates=['Datum'], date_parser = lambda x: datetime.strptime(x, '%d.%m.%Y'))
df['Datum'] = df['Datum'].dt.strftime("%d.%m.%Y")

问题是因为千位分隔符是“。”,我设法按照我想要的方式格式化日期,现在一切正常。

感谢所有帮助!

【讨论】:

    【解决方案2】:

    您是否正确指示了标题行?

    这是一个示例 CSV:

    cat seven_rows.csv                                                                                                                                                                                  
    
    0
    1
    2
    3
    4
    Datum;value1;value2;value3;value4;value5;value6;value7;value8;value9;value10;value11;value12;value13;value14
    01.03.2020;str1;str2;str3;str4;str5;str6;9,82;9,75;0,75;500,00;544,00;44,00;50,00;49,25
    

    您的原始导入:

    df = pd.read_csv('seven_rows.csv', sep=";", header=5, decimal=",")
    
            Datum value1 value2 value3 value4 value5 value6  value7  value8  value9  value10  value11  value12  value13  value14
    0  01.03.2020   str1   str2   str3   str4   str5   str6    9.82    9.75    0.75    500.0      544.0     44.0     50.0    49.25
    

    value11 转换为int

    df['value11'] = df['value11'].astype(int)
    
            Datum value1 value2 value3 value4 value5 value6  value7  value8  value9  value10  value11  value12  value13  value14
    0  01.03.2020   str1   str2   str3   str4   str5   str6    9.82    9.75    0.75    500.0      544     44.0     50.0    49.25
    

    【讨论】:

    • 如果我将逗号替换为类似逗号的非 ASCII 字符,例如 low qoute,我可以重现您的错误。请确认您的文件仅包含您想要的字符。
    • 我再次编辑了我的第一篇文章,您可以在阅读 csv 文件后看到输出。有些浮点数被识别,有些则不被识别。我在用 ”;”作为分隔符。
    • 伙计们,我想出了如何重现这个问题。示例在我的帖子中的 EDIT3 中。感谢您迄今为止的所有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    相关资源
    最近更新 更多