У меня есть 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'])
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, чтобы отправить в другую систему через внешнюю интеграцию (у меня нет к ней доступа). И требуется, чтобы я отправил его в формате csv.
И спасибо, что указали на это, я проверял, открывая csv в wps, но теперь я проверил в текстовом редакторе и обнаружил начальные нули!! Так что проблема не в коде, а в том, как я его открывал.... -_-
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 правильно читал в этот ответ.
Я думаю, что очень важно понимать, что ваш метод дает правильный вывод в файле, но вы можете неправильно считывать файл обратно. Этот ответ очень поможет, если вы добавите более подробную информацию о том, как вы проверяете/читаете CSV.