如何将秒转换为H:MM:SS并将日期保存在单独的列中

问题描述 投票:0回答:1

我有几秒钟的数据,我需要转换为H:MM:SS。当这些数据进入时,它在一个单独的列中也有一个日期字段。我需要将秒数据转换为H:MM:SS,但将日期字段保留为日期。我需要输出看起来像Excel中的所需输出。

示例所需输出:excel output

我已经尝试使用Excel编写器并设置date_format或datetime_format的默认格式,但这会转换excel文件中的所有日期时间列。来自jmcnamara的先前响应表明这是因为单元格格式优先于列格式或行格式。

这是一些我已经开始工作的示例代码,但它不是非常pythonic。它涉及将数据帧保存为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中作为字符串读取。我需要能够从时间戳中推导出平均值和总和。

谢谢!

python python-3.x pandas openpyxl
1个回答
0
投票

根据Charlie Clark在上述评论中的建议,我使用OpenpyXL的utils包将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()
© www.soinside.com 2019 - 2024. All rights reserved.