Конфликт между разделителем тысяч и форматом даты - pandas .read_csv - PullRequest
2 голосов
/ 07 мая 2020

У меня проблема с чтением данных из файла csv с помощью метода read_csv Pythons.

Формат строки:

'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 дает мне ошибку: недопустимый литерал для int () с базой 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])

В этом случае дата форматируется следующим образом: 2 января 2013 года, полночь.

И после всего этого я попытался добавить 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') )

Но по-прежнему форматируется дата, как и раньше: 2 января 2013 года, полночь . Кто-нибудь еще сталкивался с такой проблемой или знает, как ее решить?

EDIT: Итак, реальные данные выглядят так (первая строка после заголовка):

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

Pandas версия: 1.0.2

EDIT2:

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

ВЫХОД: **Headers not included because of information sensitivity**

EDIT3: Я узнал, как воспроизвести эту проблему. Пример файла 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"

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Правильно ли вы указываете строку заголовка?

Вот образец 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
0 голосов
/ 11 мая 2020

Мне удалось решить проблему.

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")

Проблема заключалась в том, что разделитель тысяч был ".", Мне каким-то образом удалось отформатировать дату, как я хотел, и теперь все работает хорошо.

Благодарю за всю помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...