#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. Большое спасибо! Кажется, это лучшее решение, чтобы избавиться от исходного заголовка.