2

我正在使用 excel powerquery 从网站中提取数据,该网站是http://www.timeanddate.com/holidays/south-africa/2014

网络表格以 mmm dd so 格式显示日期;

  • 1月01日
  • 3月20日
  • 3月21日...等。

要获得不同年份的结果,我可以调用提示来请求年份输入并替换 URL 中的相关值,如下所示;

= let
    #"Table 0" = (myParm)=>
let
    Source = Web.Page(Web.Contents("http://www.timeanddate.com/holidays/south-africa/" & Number.ToText(myParm))),

但是 - 如果没有在网络结果表中指定年份,当导入到 excel 中时,它可以理解地插入自己的值(Excel 原生只使用当前年份为 2015,powerquery 对信息的解释完全不同)等等;

  • 2001/01/01
  • 2020/03/01
  • 2021/03/01

特此提出以下问题:

  1. 我希望能够使用单元格在查询中指定年份,用单元格值替换 myParm 并在更改时刷新(可以使用 excel native 来完成,需要知道如何使用 powerquery 来完成)
  2. 我希望能够用上述单元格中的任何内容替换生成的年份列数据上的年份值
4

2 回答 2

3

对于#1,假设您有一个名为 YearTable 的 Excel 表,其中包含一个名为 Year 的列和一个包含所需年份值(例如 2015)的详细信息行,您可以使用此 M 表达式:

Excel.CurrentWorkbook(){[Name="YearTable"]}[Content]{0}[Year]

这将深入该表并从第一个详细信息行中提取值。

例如,您可以将其嵌入到您的开场步骤中,例如

Web.Page(Web.Contents("http://www.timeanddate.com/holidays/south-africa/" & Number.ToText(Excel.CurrentWorkbook(){[Name="YearTable"]}[Content]{0}[Year])))

对于#2,我将使用该表达式添加使用以下公式的添加列:

[Date] & " " & Number.ToText(Excel.CurrentWorkbook(){[Name="YearTable"]}[Content]{0}[Year])

然后,如果需要,您可以使用 Parse 按钮​​(转换功能区,在 Date 下)将其转换为 Date 数据类型。

请注意我从该页面中获得的生成的更改类型步骤将日期转换为具有隐含年份的日期(您注意到的问题)。只需编辑该步骤的公式,将“日期”列设置为“文本”即可避免这种情况。

这是我的整个测试 M 脚本:

let
    Source = Web.Page(Web.Contents("http://www.timeanddate.com/holidays/south-africa/" & Number.ToText(Excel.CurrentWorkbook(){[Name="YearTable"]}[Content]{0}[Year]))),
    Data0 = Source{0}[Data],
    #"Changed Type" = Table.TransformColumnTypes(Data0,{{"Header", type text}, {"Date", type text}, {"Weekday", type text}, {"Holiday name", type text}, {"Holiday type", type text}}),
    #"Added Derived Date" = Table.AddColumn(#"Changed Type", "Derived Date", each [Date] & " " & Number.ToText(Excel.CurrentWorkbook(){[Name="YearTable"]}[Content]{0}[Year])),
    #"Parsed Date" = Table.TransformColumns(#"Added Derived Date",{{"Derived Date", each Date.From(DateTimeZone.From(_)), type date}})
in
    #"Parsed Date"
于 2015-09-05T07:31:21.793 回答
0

Colin Banfield 的另一个解决方案;

1) 在 Excel 中,创建一个以年为列名的表,并输入年作为行值。然后从表中创建一个查询。您的查询应具有一列和一行值。适当地命名查询并保存。

2) 从网站获取数据。假设我们将查询命名为 HolidayTable。将查询转换为函数查询,例如

(Year as number)=>
 let
     Source = Web.Page(Web.Contents("www.timeanddate.com/holidays/south-africa/"&Number.ToText(Year))),
     Data0 = Source{0}[Data],
     #"Changed Type" = Table.TransformColumnTypes(Data0,{{"Header", type text}, {"Date", type date}, {"Weekday", type text}, {"Holiday name", type text}, {"Holiday type", type text}}),
     #"Removed Columns" = Table.RemoveColumns(#"Changed Type",{"Header"})
 in
     #"Removed Columns"

3)在步骤(1)查询中添加该函数作为新列,并添加新的日期自定义列。在进行了几次其他转换(列重新排序、列删除)之后,您应该得到一个如下所示的查询:

let
     Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
     #"Changed Type" = Table.TransformColumnTypes(Source,{{"Year", Int64.Type}}),
     #"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each HolidayTable([Year])),
     #"Expanded Custom" = Table.ExpandTableColumn(#"Added Custom", "Custom", {"Date", "Weekday", "Holiday name", "Holiday type"}, {"Date", "Weekday", "Holiday name", "Holiday type"}),
     #"Added Custom1" = Table.AddColumn(#"Expanded Custom", "Calendar Date", each #date([Year],Date.Month([Date]),Date.Day([Date]))),
     #"Reordered Columns" = Table.ReorderColumns(#"Added Custom1",{"Year", "Date", "Calendar Date", "Weekday", "Holiday name", "Holiday type"}),
     #"Removed Columns" = Table.RemoveColumns(#"Reordered Columns",{"Year","Date"})
 in
     #"Removed Columns"

笔记:

a) 前两行来自步骤 (1) 中的原始表查询。

b) #"Added Custom" 步骤增加了一个新的自定义列,将Year列中的值传递给HolidayTable函数

c) #"Added Custom1" 步骤添加了一个新的自定义列,该列根据 Year 列中的值以及原始 Date 列中的月份和日期值创建新日期。

于 2015-09-06T17:38:21.790 回答