【问题标题】:How to change the date format while writing it to excel file using openpyxl如何在使用openpyxl将日期格式写入excel文件时更改日期格式
【发布时间】:2019-06-08 14:13:58
【问题描述】:

我想将日期格式从dd-mm-yy 转换为mm-yy,同时将其写入excel 文件。我尝试了所有方法,但没有成功。我正在尝试从一个 Excel 文件中复制数据并将其粘贴到另一个文件中。但是日期搞砸了一切。

这是我的原始文档。代码将从哪里复制数据:

这是它在目标 excel 文件中的显示方式:

我也使用过 Openpyxl,Pandas。

【问题讨论】:

  • df.Date.dt.strftime('%b-%Y') 看看strftime

标签: python python-3.x pandas openpyxl


【解决方案1】:

如果您有一个包含所有要编写的内容的变量,只需使用datetime_format 而不是date_format

例如,我正在删除一个名为 ValorLiq 的工作表,然后重写它。我有我想写的内容myFILE。 命令是:

fn = 'C:/Users/whatever/yourspreadsheet.xlsx'
writer=pd.ExcelWriter(fn,mode='a',engine='openpyxl',datetime_format='DD/MM/YYYY')
idx = writer.book.sheetnames.index('ValorLiq')
writer.book.remove(writer.book.worksheets[idx])
myFILE.to_excel(writer, merge_cells = False, sheet_name='ValorLiq')
writer.save()

【讨论】:

  • 我用过writer = pd.ExcelWriter(xlfile, engine = 'openpyxl', datetime_format= 'M/D/YYYY')
【解决方案2】:

问题是您仍在编写日期时间 - 您需要在写入之前将它们转换为字符串(除了字符串中的内容之外,您会丢失所有内容)或设置单元格的数字格式:

from openpyxl import Workbook                    # openpyxl  2.6.2
from openpyxl.utils import get_column_letter

import datetime

basedate = datetime.datetime.today() 

# create some demo dates, roughly -5 to +5 months
some_dates = [basedate + datetime.timedelta(days = i*30) for i in range(-5,6)]
print(some_dates)

# create a workbook
wb = Workbook() 
ws1 = wb.active
ws1.title = "dates"
ws1["A1"] = "Daaaaaaaaates"
# fill dates manually to enable cell formatting
for i, date in enumerate(some_dates,2):
    ws1[f"A{i}"] = date                # no format

    ws1[f"B{i}"] = date                # formatted to MM.YY
    cell = ws1.cell(column=2, row=i)   # get cell and change format
    cell.number_format = "MM.YY"       # use 'MM-YY' if you want a dash between month/year

    # uncomment if you want to store the stringified version directly
    # ws1[f"C{i}"] = date.strftime("%m.%y")

wb.save(filename = 'workbook.xlsx')

这会给你一个打印的列表

[datetime.datetime(2019, 1, 9, 17, 1, 57, 329142), 
 datetime.datetime(2019, 2, 8, 17, 1, 57, 329142), 
 datetime.datetime(2019, 3, 10, 17, 1, 57, 329142), 
 datetime.datetime(2019, 4, 9, 17, 1, 57, 329142), 
 datetime.datetime(2019, 5, 9, 17, 1, 57, 329142), 
 datetime.datetime(2019, 6, 8, 17, 1, 57, 329142), 
 datetime.datetime(2019, 7, 8, 17, 1, 57, 329142), 
 datetime.datetime(2019, 8, 7, 17, 1, 57, 329142), 
 datetime.datetime(2019, 9, 6, 17, 1, 57, 329142), 
 datetime.datetime(2019, 10, 6, 17, 1, 57, 329142), 
 datetime.datetime(2019, 11, 5, 17, 1, 57, 329142)]

还有一个导出的文件(OpenOffice 用来打开),如下所示:

HTH

【讨论】:

    【解决方案3】:

    要实现您想要的效果,需要为每个单元格创建和分配命名样式。 这是一个工作示例:

    import pandas as pd
    from openpyxl import Workbook
    from openpyxl.styles import NamedStyle
    # Create a dataframe having a column of dates
    df = pd.DataFrame({'DATE':pd.date_range(start='2018-1-1', end='2019-1-1')})
    df = df.assign(DATE2=df["DATE"])
    df = df.assign(DATE3=df["DATE"])
    # Create a excel work book
    ewb = pd.ExcelWriter('test.xlsx', engine="openpyxl")
    # Create a named style
    nsmmyy=NamedStyle(name="cd1", number_format="MM-YY")
    nsmmmyy=NamedStyle(name="cd2", number_format="MMM-YY")
    nsbyy=NamedStyle(name="cd3", number_format="MMMM-YY")
    # Write dataframe to workbook
    df.to_excel(excel_writer=ewb, sheet_name="SHT1")
    # Get the work book by name
    ws = ewb.book["SHT1"]
    # For each cell in the column set the named style
    # Add +2 to the number of rows since excel index starts from 1
    for i in range(1, len(df) + 2):
        # Pass column argument as 2, since column 1 will have dataframe index
        ws.cell(row=i, column=2).style = nsmmyy
        ws.cell(row=i, column=3).style = nsmmmyy
        ws.cell(row=i, column=4).style = nsbyy
    # Save work book
    ewb.save()
    

    生成的 excel 工作表如下所示:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-28
      • 2016-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多