Как обрабатывать дату как обычный текст с pandas? - PullRequest
0 голосов
/ 12 июля 2020

Я использую pandas для чтения файла .csv, а затем сохраняю его как файл .xls. Введите следующий код:

import pandas as pd
df = pd.read_csv('filename.csv', encoding='GB18030')
print(df)
df.to_excel('filename.xls')

Там столбец содержит дату, например, «2020/7/12», похоже, что pandas распознал ее как дату и автоматически выдает ее в «2020-07-12». Я не хочу форматировать этот столбец или любые другие подобные столбцы, я бы хотел, чтобы все данные оставались такими же, как обычный текст.

Это преобразование происходит в read_csv(), потому что print(df) уже выводит YYYY-MM-DD, до to_excel().

Я пробовал использовать df.info(), чтобы проверить тип данных этого столбца, тип данных - объект. Затем я добавил аргумент dtype=pd.StringDtype() к read_csv(), и это не помогло.

Файл содержит китайские символы, поэтому я установил кодировку GB18030, не знаю, имеет ли это значение.

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Проблема решена. Я дважды проверил свой файл .csv, открыл его с помощью блокнота, данные - 2020-07-12, которые отображаются как 2020/7/12 в Office. Оказалось, что Office переформатировал дату на yyyy/m/d (в зависимости от вашего региона). Я разрабатываю инструмент для обработки и импорта данных в БД для своей компании, мы выполняли эту работу вручную, копируя и вставляя, поэтому никто не заметил эту проблему. Спасибо @ Valdi_Bo за его расследование и терпение.

0 голосов
/ 12 июля 2020

Мой опыт относительно pd.read_csv показывает, что:

  • По умолчанию конвертируются только столбцы, конвертируемые в int или float к соответствующим типам.
  • Строки, похожие на дату, по-прежнему читаются как строки (тип столбца в результирующем DataFrame на самом деле объект ).

Если вы хотите, чтобы read_csv преобразовал такой столбец в тип datetime , вы должны передать параметр parse_dates , указав список столбцов, которые нужно проанализировать как даты. Поскольку вы этого не делали, ни один исходный столбец не должен преобразовываться в тип datetime .

Чтобы проверить эту деталь, после того, как вы прочитаете файл , запустите file.info() и проверьте тип рассматриваемого столбца.

Итак, если соответствующий столбец файла Excel имеет тип Date , то, вероятно, это преобразование вызвано to_excel .

И еще одно замечание относительно имен переменных: то, что вы прочитали с помощью read_csv , - это DataFrame , а не файл . Фактический файл - это объект источник , из которого вы читаете содержимое, но здесь вы передали только файл имя .

Так что не используйте имена вроде file , чтобы назвать получившийся DataFrame, так как это вводит в заблуждение. Намного лучше использовать, например, df .

Редактировать после комментария от 05: 58Z

Чтобы полностью проверить то, что вы написали в своем комментарии, я создал следующий файл CSV:

DateBougth,Id,Value
2020/7/12,1031,500.15
2020/8/18,1032,700.40
2020/10/16,1033,452.17

Я запустил: df = pd.read_csv('Input.csv'), а затем print(df), получив:

   DateBougth    Id   Value
0   2020/7/12  1031  500.15
1   2020/8/18  1032  700.40
2  2020/10/16  1033  452.17

Итак, на Pandas уровень, преобразование формата не произошло в столбце DateBougth . Оба оставшихся столбца содержат содержимое numeri c, поэтому они были автоматически преобразованы в int64 и float64 , но DateBought осталось как object .

Затем я сохранил этот df в файл Excel, запустил: df.to_excel('Output.xls') и открыл его в Excel. Содержимое:

введите описание изображения здесь

Таким образом, ни на уровне Excel преобразование типов данных не происходило.

Чтобы увидеть фактический тип данных ячейки B2 (первый DateBougth ), я щелкнул по этой ячейке и нажал Ctrl-1 , чтобы отобразить форматирование ячейки. Формат: Общий (а не Дата ), как я и ожидал.

Может быть, у вас устаревшая версия программного обеспечения? Я использую Python v. 3.8.2 и Pandas v. 1.0.3.

Еще одна деталь, которую нужно проверить: посмотрите на свой код после pd.read_csv . Может, где-то вы положили инструкцию типа df.DateBought = pd.to_datetime (df.DateBought) (явное преобразование типов)? Или хотя бы преобразование формата. Обратите внимание, что в моей среде не было абсолютно никаких изменений в формате столбца DateBought .

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