使用Python和Pandas从HTML表格中的另一种日期格式转换为Excel“日期”格式(在Excel文件中)。

5

我是Python的新手,正在探索使用它从Excel中获取数据,并发现了pandas库可以获取数据。

我需要从一个网站上的HTML表格中获取汇率信息。 需要读取数据的表格,然后将其转储到一个Excel文件中。我正在使用Python编程语言,下面是我使用的代码:

import pandas as pd
from datetime import datetime
import lxml as lx
import openpyxl as oxl
url = "https://www.example.com"

tables = pd.read_html(url)
table = tables[0]
table.to_excel('output.xlsx')

日期格式为“Effective Date”列中的dd mmm yyyy格式。
我想将它们转换为dd/mm/yyyy格式。
我使用以下代码来转换表格。
['Effective Date'] = pd.to_datetime(table['Effective Date'],
                                        infer_datetime_format=False, format='%d/%m/%Y', errors='ignore')

但它没有成功将列中的日期进行转换。请问有人能指导我正确的方向吗?

以下是完整的代码:

import pandas as pd
import html5lib
import datetime
import locale
import pytz
import lxml as lx
import openpyxl as oxl

url = "https://www.rba.gov.au/statistics/cash-rate/"

tables = pd.read_html(url)

table = tables[0]

table['Effective Date'] = pd.to_datetime(table['Effective Date'],
                                        infer_datetime_format=False, format='%d/%m/%Y', errors='ignore')

table.to_excel('rates.xlsx')

使用['Effective Date'] = pd.to_datetime(table['Effective Date'], format='%d %b %Y', errors='ignore')。在转换为datetime时,需要传递现有日期的格式,而不是要转换的格式。在Excel中,如果用户在计算机上设置了英国区域设置,则打开Excel文件时日期将自动转换。 - David Erickson
感谢您的回复@DavidErickson,但这并没有帮助到我。在Excel中,在导出后验证日期时,该类别的数据类型为常规。 - grumpypig
请查看我的答案。 - David Erickson
1个回答

7
您需要使用pd.ExcelWriter创建一个writer对象,以便您可以在Excel中更改为日期格式。但是,这个问题有几个不同的方面:
  1. 您的日期列中有非日期值,包括“图例:”,“现金利率下降”,“现金利率上涨”和“现金利率不变”。
  2. 如评论中所述,必须传递format ='%d %b %Y'pd.to_datetime(),因为这是您要转换的日期格式。
  3. 您必须传递errors ='coerce'以返回任何不符合指定格式的NaT
  4. 对于pd.to_datetime()代码行,您必须在末尾添加.dt.date,因为我们稍后在创建writer对象时使用date_format参数而不是datetime_format参数。但是,您也可以排除dt.date并更改datetime_format参数的格式。
  5. 然后,执行table = table.dropna()以删除任何带有NaT列的行。
  6. Pandas不会在Excel中更改日期格式。如果您想要这样做,那么您应该使用openpyxl创建一个writer对象并传递date_format。如果有人说这样,您不能简单地执行:pd.to_datetime(table ['Effective Date'],format ='%d %b %Y',errors ='coerce') .dt.strftime ('%m /%d /%y').dt.strftime('%d /%m /%y'),因为这会在Excel中创建“常规”日期格式。
  7. 如果您不加宽列,则输出很丑陋,因此我也包括了代码。请注意,我使用美国语言环境,因此传递d / m / yyyy会在Excel中创建“自定义”格式。

注意:在我的代码中,我必须传递m/d/yyyy才能在Excel中显示“日期”格式。由于我的电脑与您的不同(美国),因此Excel利用不同区域设置进行日期格式。您可以简单地更改为date_format ='d/m/yyyy'

来源+更多关于此主题的信息


import pandas as pd
import html5lib
import datetime
import locale
import pytz
import lxml as lx
import openpyxl as oxl

url = "https://www.rba.gov.au/statistics/cash-rate/"

tables = pd.read_html(url)

table = tables[0]

table['Effective Date'] = pd.to_datetime(table['Effective Date'], format='%d %b %Y', errors='coerce').dt.date
table = table.dropna()
table.to_excel('rates.xlsx')

writer = pd.ExcelWriter("rates.xlsx",
                        engine='xlsxwriter',
                        date_format='m/d/yyyy')

# Convert the dataframe to an XlsxWriter Excel object.
table.to_excel(writer, sheet_name='Sheet1')

# Get the xlsxwriter workbook and worksheet objects in order to set the column
# widths, to make the dates clearer.
workbook  = writer.book
worksheet = writer.sheets['Sheet1']
worksheet.set_column('B:E', 20)

# Close the Pandas Excel writer and output the Excel file.
writer.save()

enter image description here


1
哇,哇...真的很棒。这真的帮了我很多。说实话,我对Python和Excel操作还很陌生。有没有什么方法可以让我在这方面变得更好呢?非常感谢你的帮助。 - grumpypig
另外,如果您不介意的话,能否回答我另一个问题。这解决了我的问题的前半部分。还有另一半......如果我有一个带有日期的数据表,我可以比较上面示例中的现金利率,并根据日期应用有效利率,以最高的为准...基本上是将此数据从网站复制到另一个Excel表格中,在放置之前,比较价值,然后添加它。 - grumpypig
1
只需不停地练习。在使用 Excel 功能进行列宽调整、字体大小更改、插入列、公式等方面,xlsxwriteropenpyxlxlwings 都是很好的库。pandas 主要用于在数据输入 Excel 前进行数据清洗和处理。但如果你想通过 Python 使用 Excel 内置功能,那么可以使用 xlsxwriteropenpyxlxlwings - David Erickson
1
@grumpypig 请创建一个新的StackOverFlow问题。您可以将此问题作为基础参考。我相信会有人能够帮助您。当新问题发布时,请随时在此处进行评论,但我目前正在处理其他事情。谢谢! - David Erickson
@grumpypig 没问题。还请通过点击我的答案旁边的复选标记接受答案。我看到您最初已经选中了它,但后来又取消了选择。 - David Erickson
1
请现在检查。 - grumpypig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接