Поле даты из фрейма данных удаляет первые 0 после экспорта - PullRequest
2 голосов
/ 31 мая 2019

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

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'])

  • , затем используйте apply для применения и 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

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

Ответы [ 3 ]

2 голосов
/ 31 мая 2019

То, что я буду делать, это использовать 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
2 голосов
/ 31 мая 2019

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 в файл CSV .

1 голос
/ 01 июня 2019

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

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, чтобы правильно прочитать в этот ответ .

...