Поле даты из фрейма данных удаляет начальный 0 после экспорта

У меня есть Dataframe со следующим полем даты:

463    14-05-2019
535    03-05-2019
570    11-05-2019
577    09-05-2019
628    08-08-2019
630    25-05-2019
Name: Date, dtype: object

Я должен отформатировать его как DDMMAAAA. Вот что я делаю внутри цикла (for idx, row in df.iterrows():):

  • Я удаляю символ \- с помощью регулярного выражения:

    df.at[idx, 'Date'] = re.sub('\-', '', df.at[idx, 'Date'])

  • затем с помощью применения применить и 8-значную строку с ведущими нулями

    df['Date'] = df['Date'].apply(lambda x: '{0:0>8}'.format(x))

Но даже несмотря на то, что поле df['Date'] имеет 8 цифр с начальным 0 в df, при экспорте его в csv начальные нули удаляются в экспортированном файле, как показано ниже.

df.to_csv(path_or_buf=report, header=True, index=False, sep=';')

поле как в csv:

Dt_DDMMAAAA
30102019
12052019
7052019
26042019
3052019
22042019
25042019
2062019

Я знаю, что где-то здесь я упускаю суть, но я просто не могу понять, в чем проблема (или если это вообще проблема, а не неправильно используемый метод).

Я думаю, что очень важно понимать, что ваш метод дает правильный вывод в файле, но вы можете неправильно считывать файл обратно. Этот ответ очень поможет, если вы добавите более подробную информацию о том, как вы проверяете/читаете CSV.

chthonicdaemon 01.06.2019 05:36

Я экспортирую его в csv, чтобы отправить в другую систему через внешнюю интеграцию (у меня нет к ней доступа). И требуется, чтобы я отправил его в формате csv.

Lucas Vasconcellos Czepaniki 01.06.2019 05:48

И спасибо, что указали на это, я проверял, открывая csv в wps, но теперь я проверил в текстовом редакторе и обнаружил начальные нули!! Так что проблема не в коде, а в том, как я его открывал.... -_-

Lucas Vasconcellos Czepaniki 01.06.2019 05:50
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
898
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

IMO самый простой способ — использовать аргумент date_format при записи в CSV. Это означает, что вам нужно будет заранее преобразовать столбец «Дата» в datetime, используя pd.to_datetime.

(df.assign(Date=pd.to_datetime(df['Date'], errors='coerce'))
   .to_csv(path_or_buf=report, date_format='%d%m%Y', index=False))

Это печатает,

Date
14052019
05032019
05112019
05092019
08082019
25052019

Дополнительную информацию об аргументах to_csv можно найти в Запись pandas DataFrame в файл CSV.

Что я буду делать, так это использовать strftime + 'to_excel`, так как в csv, если вы откроете его с текстом, он покажет начальный ноль, так как csv не будет сохранять какой-либо формат при отображении, в этом случае вы можете использовать excel

pd.to_datetime(df.Date,dayfirst=True).dt.strftime('%m%d%Y').to_excel('your.xls')
Out[722]: 
463    05142019
535    05032019
570    05112019
577    05092019
628    08082019
630    05252019
Name: Date, dtype: object

Во-первых, ваш метод создает файл, который содержит ведущие нули, как вы и ожидали. Я реконструировал этот минимальный рабочий пример из вашего описания, и он отлично работает:

import pandas
import re

df = pandas.DataFrame([["14-05-2019"],
                       ["03-05-2019"],
                       ["11-05-2019"],
                       ["09-05-2019"],
                       ["08-08-2019"],
                       ["25-05-2019"]], columns=['Date'])

for idx in df.index:
    df.at[idx, 'Date'] = re.sub('\-', '', df.at[idx, 'Date'])
df['Date'] = df['Date'].apply(lambda x: '{0:0>8}'.format(x))

df.to_csv(path_or_buf = "report.csv", header=True, index=False, sep=';')

На данный момент report.csv содержит это (с ведущими нулями, как вы и хотели).

Date
14052019
03052019
11052019
09052019
08082019
25052019

Теперь о том, почему вы думали, что это не работает. Если вы в основном используете Pandas, вы можете запретить ему угадывать тип вывода, указав dtype в read_csv:

df_readback = pandas.read_csv('report.csv', dtype = {'Date': str})


       Date
0  14052019
1  03052019
2  11052019
3  09052019
4  08082019
5  25052019

Также может быть, что вы читаете это в Excel (я предполагаю, что вы используете разделители ;). К сожалению, нет способа гарантировать, что Excel правильно считывает это поле при двойном щелчке, но если это ваша конечная цель, вы можете увидеть, как изменить файл, чтобы Excel правильно читал в этот ответ.

Другие вопросы по теме