【问题标题】:How can I add a column to a merged table created with Power Query in Excel 2016?如何在 Excel 2016 中向使用 Power Query 创建的合并表添加列?
【发布时间】:2020-01-19 21:46:56
【问题描述】:

我有一个 Excel 2016 文件,其中包含使用 Power Query 连接在一起的多个表。这些表有一些以文本形式填充的日期字段(例如“1022018”=2018 年 1 月 2 日),我需要将它们转换为日期。我为每个列添加了一个可以很好地转换数据的列,但是每次刷新查询时,新列都会消失。

我打开 Power Query 并尝试添加一个自定义列,但我在 Excel 中创建的公式不起作用,它需要用 M 编写。我没有找到轻松转换为 M 或其他创建方式的运气使用 Excel 公式的列。

任何想法如何做到这一点?

仅供参考,这里是公式:=IF(LEN([@DOBstring])=7,DATE(RIGHT([@DOBstring],4),LEFT([@DOBstring],1),MID([@DOBstring],2,2)),DATE(RIGHT([@DOBstring],4),LEFT([@DOBstring],2),MID([@DOBstring],3,2)))

【问题讨论】:

    标签: excel powerquery


    【解决方案1】:

    如果我理解正确,输入字符串中的 month 不是零填充的(导致输入字符串的长度为 7 或 8)。

    可能值得创建一个像下面这样的小函数,它将处理变化的长度,然后尝试根据假定的字符位置解析日期。

    ParseDate = (someText as text) as date =>
            let
                zeroPadded = Text.End("0" & someText, 8),
                yearParsed = Text.End(zeroPadded, 4),
                monthParsed = Text.Start(zeroPadded, 2),
                dayParsed = Text.Middle(zeroPadded, 2, 2),
                dateParsed = #date(Number.From(yearParsed), Number.From(monthParsed), Number.From(dayParsed))
            in dateParsed,
    

    然后,您可以在转换现有列或添加新列时调用它。举个例子:

    let
        ParseDate = (someText as text) as date =>
            let
                zeroPadded = Text.End("0" & someText, 8),
                yearParsed = Text.End(zeroPadded, 4),
                monthParsed = Text.Start(zeroPadded, 2),
                dayParsed = Text.Middle(zeroPadded, 2, 2),
                dateParsed = #date(Number.From(yearParsed), Number.From(monthParsed), Number.From(dayParsed))
            in dateParsed,
        someTable = Table.FromColumns({{"1022018", "05242019", "12282026"}}, type table [toParse = text]),
        transformedColumn = Table.TransformColumns(someTable, {{"toParse", ParseDate, type date}}),
        addedColumn = Table.AddColumn(someTable, "parsed", each ParseDate([toParse]), type date)
    in
        addedColumn
    

    给出:

    【讨论】:

      【解决方案2】:

      在 Power Query 中,使用以下公式创建自定义列:

      = if Text.Length([Date])=7 then
        Text.Middle([Date],1,2)
          & "-"
          & "0"
          & Text.Start([Date], 1)
          & "-"
          & Text.End([Date],4) 
      else
        Text.Middle([Date],2,2)
          & "-"
          & Text.Start([Date], 2)
          & "-"
          & Text.End([Date],4)
      

      这将产生格式为 dd-mm-yyyy 的文本。根据您的区域设置,在将此自定义列格式化为日期时,这将被转换为正确的日期值。

      否则,您将需要这个公式:

      = if Text.Length([Date])=7 then 
        "0"
          & Text.Start([Date], 1)
          & "-"
          & Text.Middle([Date],1,2)
          & "-"
          & Text.End([Date],4)
      else
        Text.Start([Date], 2)
          & "-"
          & Text.Middle([Date],2,2)
          & "-"
          & Text.End([Date],4)
      

      【讨论】:

        猜你喜欢
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-09
        • 2020-05-31
        • 1970-01-01
        相关资源
        最近更新 更多