Как преобразовать секунды в H: MM: SS и сохранить дату в отдельном столбце - PullRequest
0 голосов
/ 07 января 2019

У меня есть данные в секундах, которые мне нужно преобразовать в H: MM: SS. Когда эти данные поступают, у них также есть поле даты в отдельном столбце. Мне нужно преобразовать данные секунд в H: MM: SS, но сохранить поле даты как дату. Мне нужно, чтобы вывод был похож на желаемый вывод в Excel.

Пример желаемого выхода: превосходный вывод

Я попытался использовать Excel Writer и установить формат по умолчанию date_format или datetime_format, однако это преобразует все столбцы datetime в файле excel. Предыдущие ответы от jmcnamara указывают, что это потому, что формат ячейки имеет приоритет над форматом столбца или строки.

Вот пример кода, который я получил, но он не очень питонический. Это включает сохранение кадра данных в Excel, но затем повторное открытие этого точного файла.

# imports
import pandas as pd
import random
from openpyxl import load_workbook
from openpyxl.styles import NamedStyle


# generate data
numbers = (random.sample(range(500, 2000), 10))
df = pd.DataFrame(numbers)
df.rename(columns={df.columns[0]:'Time'}, inplace=True)


# convert to time
df['Timestamp'] = pd.to_timedelta(df['Time'], unit='s') + pd.Timestamp(0)
#df['Openpyxl Time'] = pd.to_timedelta(df['Time'], unit='s') + pd.Timestamp(0)


# write to file
writer = pd.ExcelWriter('test.xlsx', engine = 'xlsxwriter')
df.to_excel(writer, sheet_name= 'Sheet 1', index=False)
writer.save()

# load just created file
wb = load_workbook('test.xlsx')
ws = wb.active

# set format style
date_style = NamedStyle(name='datetime', number_format='h:mm:ss')

# simple way to format but also formats column header
for cell in ws['C']:
    cell.style = date_style

#more complex way to format, but does not format column header
# for row in ws.iter_rows('C{}:C{}'.format(ws.min_row+1, ws.max_row)):
#     for cell in row:
#         cell.style = date_style

wb.save('test.xlsx')
wb.close()

Как мне переписать это, чтобы не пришлось заново открывать файл Excel, чтобы изменить разные столбцы на разные форматы даты и времени?

Желаемый вывод также не может быть прочитан как строка в Excel. Я должен быть в состоянии получить средние значения и сумму из отметок времени.

Спасибо!

1 Ответ

0 голосов
/ 09 января 2019

После рекомендации Чарли Кларка в комментариях выше я использовал пакет утилит OpenpyXL, чтобы преобразовать информационный фрейм pandas в рабочую книгу openpyxl. После преобразования в рабочую книгу я могу использовать тот же код для остальной части сценария.

 # imports
import pandas as pd
import random
from openpyxl.styles import NamedStyle
from openpyxl.utils.dataframe import dataframe_to_rows
from openpyxl import Workbook


# generate data
numbers = (random.sample(range(500, 2000), 10))
df = pd.DataFrame(numbers)
df.rename(columns={df.columns[0]: 'Time'}, inplace=True)


# convert to time
df['Timestamp'] = pd.to_timedelta(df['Time'], unit='s') + pd.Timestamp(0)

# create empty openpyxl workbook
wb = Workbook()
ws = wb.active

# convert pandas dataframe to openpyxl workbook
for r in dataframe_to_rows(df, index=False, header=True):
    ws.append(r)

# set format style in openpyxl
date_style = NamedStyle(name='datetime', number_format='h:mm:ss')

# simple way to format but also formats column header
for cell in ws['B']:
    cell.style = date_style

# more complex way to format, but does not format column header
# for row in ws.iter_rows('C{}:C{}'.format(ws.min_row+1, ws.max_row)):
#     for cell in row:
#         cell.style = date_style

# save workbook
wb.save('test.xlsx')
wb.close()
...