Изменение формата заголовка python pandas на excel

#python #pandas #date #header

#python #pandas #Дата #заголовок

Вопрос:

Есть ли возможность изменить формат заголовка моего фрейма данных pandas, который записывается в файл Excel. Может быть, это необычно, но мой заголовок состоит из дат и времени, и я хочу, чтобы «формат ячейки» файла Excel был «формат даты».

Я пробовал что-то вроде этого:

 import pandas as pd

data = pd.DataFrame({'1899-12-30 00:00:00': [1.5,2.5,3.5,4.5,5.4]})

writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')

data.to_excel(writer, sheet_name='Sheet1',index=True)
workbook  = writer.book
worksheet = writer.sheets['Sheet1']

date_fmt = workbook.add_format({'num_format': 'dd.mm.yyyy  hh:mm:ss'})
worksheet.set_row(0, 20, date_fmt)

writer.save()
  

но set_row, похоже, не изменяет форматы заголовков. Я также преобразовал даты в значение серийной даты Excel, но это тоже не помогло.

Ответ №1:

Есть несколько вещей, которые вам нужно будет сделать, чтобы заставить это работать.

Во-первых, следует избегать заголовка Pandas по умолчанию, поскольку это установит заголовок ячейки, который нельзя перезаписать set_row() . Лучше всего пропустить заголовок по умолчанию и написать свой собственный (см. Раздел Форматирование заголовков фреймов данных в документах XlsxWriter).

Во-вторых, даты в Excel имеют формат чисел, поэтому вам нужно будет преобразовать заголовок строки в число или, что лучше, в объект datetime (см. Раздел «Работа с датами и временем» документации).

Наконец, «1899-12-30» не является допустимой датой в Excel.

Вот рабочий пример с некоторыми из этих исправлений:

 import pandas as pd
from datetime import datetime

data = pd.DataFrame({'2020-09-18 12:30:00': [1.5, 2.5, 3.5, 4.5, 5.4]})

writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')

# Turn off the default header and skip one row to allow us to insert a user
# defined header.
data.to_excel(writer,
              sheet_name='Sheet1', index=True,
              startrow=1, header=False)

# Get the xlsxwriter workbook and worksheet objects.
workbook = writer.book
worksheet = writer.sheets['Sheet1']

# Add a header format.
date_fmt = workbook.add_format({'num_format': 'dd.mm.yyyy  hh:mm:ss'})

# Convert the column headers to datetime objects and write them with the
# defined format.
for col_num, value in enumerate(data.columns.values):

    # Convert the date string to a datetime object.
    date_time = datetime.strptime(value, '%Y-%m-%d %H:%M:%S')

    # Make the column wider for clarity.
    worksheet.set_column(col_num   1, col_num   1, 20)

    # Write the date.
    worksheet.write(0, col_num   1, date_time, date_fmt)

writer.save()

  

Вывод:

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

Комментарии:

1. Большое спасибо! Кажется, это лучшее решение, чтобы избавиться от исходного заголовка.