【发布时间】: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