Power BI M语言列表。选择如何按日期过滤

时间:2020-09-14 19:38:26

标签: powerbi powerquery m

当我使用此方法时:List.Select({[Date1],[Date2],[Date3]},每个_ <[Date4])都会返回错误。但是,当我使用以下代码时:List.Select({“ 2020-01-01”,“ 2020-02-01”,“ 2020-03-01”},每个_ <“ 2020-04-01”)都会返回值列表。

1 个答案:

答案 0 :(得分:2)

首先,我假设这是在Table.AddColumn之类的函数的上下文中-如果是这样,那么导致错误的原因是:您引用的是内部函数的列表项参数,而不是外部函数的表记录参数与“ [Date4]”参考。

一旦在涉及的语法糖下公开了完整的代码,就更容易看到此修复程序:只需为内部参数使用其他标识符即可。

= Table.AddColumn(
    Table1, 
    "New Column Name", 
    each List.Select(
        {[Date1],[Date2],[Date3]},
         each _ < [Date4]
    )
)

以上内容如何运作?再看一下原始代码的完整M代码,再假设我们正在使用Table.AddColumn之类的函数:

    = Table.AddColumn(
        Table1, 
        "New Column Name", 
        (_)=> List.Select(
            {_[Date1],_[Date2],_[Date3]},
            (_)=> _ < _[Date4]
        )
    )

我们可以看到实际上每个都有两个。帮助我们理解问题的三点:

  1. “每个”是“(_)=>”的语法糖,它定义了一个函数,其中 传递的参数用“ _”引用
  2. 传递给外部的值是表的当前行,作为 记录,其中行中的每个列/值是所述记录中的字段;方括号用于访问记录中的字段
  3. 对没有记录的字段的引用假定记录为“ _”,例如“ [Date1]”未指定 记录只是“ _ [Date1]”的语法糖

基于以上几点,我们可以如下重写代码

def ChangeDF(df)
    return df[["Col1","Col2"]]

df = pd.DataFrame([[1, "One", "Hello"], [2, "Two", "Hi"]], columns=["Col1", "Col2", "Col3"])
df = ChangeDF(df)

现在您可以看到有一个外部的“ _”引用表的每一行作为一条记录,这使我们可以使用“ _ [Date1]”来访问字段。另一方面,内部的“ _”正在访问输入列表的每个值。因此,在最内部的函数“ _ <_ [Date4]”的上下文中,“ _”仅指内部的“ _”-即,您试图从日期值访问记录字段,从而导致错误。