简体   繁体   English

Power Query: Expression.Error: 枚举中没有足够的元素来完成操作。 (列表)

[英]Power Query: Expression.Error: There weren't enough elements in the enumeration to complete the operation. (LIST)

What I am trying to achieve is to obtain "matches/pairs" from two tables.我想要实现的是从两个表中获取“匹配/对”。 One (source 1)is data.table with Date/Time and Pressure value columns and the other (source 2) is like Date/Time and Info value Columns.一个(来源 1)是 data.table,带有日期/时间和压力值列,另一个(来源 2)类似于日期/时间和信息值列。 Second table has so called "pairs", start and stop in certain time.第二张桌子有所谓的“对”,在特定时间开始和停止。 I want to get exact matches when is found in source 1 or approximate match when is not exact as in source 1 (seconds can be a problem).我想在源 1 中找到精确匹配,或者在与源 1 不完全匹配时获得近似匹配(秒可能是个问题)。

Lets say you are matching/lookup two tables, give me everything that falls between for instance 15.01.2022 06:00:00 and 15.01.2022 09:15:29.假设您正在匹配/查找两个表,请给我例如 15.01.2022 06:00:00 和 15.01.2022 09:15:29 之间的所有内容。

Where I have a problem is more likely exact match and seconds.我遇到问题的地方更有可能是精确匹配和秒数。 It is skipping or cant find any pair if the seconds are not matching.如果秒数不匹配,它将跳过或找不到任何对。 So my question is how to make if not seconds then lookup for next availablee match, can be a minute too as long as they are in the given range (start stop instances).所以我的问题是,如果不是秒,那么如何查找下一个可用的匹配项,只要它们在给定范围内(启动停止实例),也可以是一分钟。 That is a reason I am getting this Expression error.这就是我收到此表达式错误的原因。 Or is there a way to skip that error and proceed with Query??或者有没有办法跳过该错误并继续查询?

Link to download the data:数据下载链接:

https://docs.google.com/spreadsheets/d/1Jv5j7htAaEFktN0ntwOZCV9jesF43tEP/edit?usp=sharing&ouid=101738555398870704584&rtpof=true&sd=true https://docs.google.com/spreadsheets/d/1Jv5j7htAaEFktN0ntwOZCV9jesF43tEP/edit?usp=sharing&ouid=101738555398870704584&rtpof=true&sd=true

On the code below is what I am trying to do:下面的代码是我想要做的:

    let

//Be sure to change the table names in the Source= and Source2= lines to be the actual table names from your workbook
    Source = Excel.CurrentWorkbook(){[Name="Parameters"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Date/Time", type datetime}, {"P7 [mbar]", Int64.Type}}),
       
//get start/stop times table
    Source2 = Excel.CurrentWorkbook(){[Name="Log_Original"]}[Content],
    typeIt = Table.TransformColumnTypes(Source2, {"Date/Time", type datetime}),
    #"Filtered Rows" = Table.SelectRows(typeIt, each ([#"Date/Time"] <> null)),
    #"Added Index" = Table.AddIndexColumn(#"Filtered Rows", "Index", 0, 1),

#"Added Custom" = Table.AddColumn(#"Added Index", "NextLineStart", each if Text.Contains([Info],"start", Comparer.OrdinalIgnoreCase) = true 
                and Text.Contains(#"Added Index"[Info]{[Index]+1},"start",Comparer.OrdinalIgnoreCase) = true 
            then "delete" 
            else null),
    #"Filtered Rows1" = Table.SelectRows(#"Added Custom", each ([NextLineStart] = null)),
    #"Removed Columns1" = Table.RemoveColumns(#"Filtered Rows1",{"Index", "NextLineStart"}),

//create a list of all the relevant start/stop times
     filterTimes = List.Combine(
                        List.Generate(
                            ()=> [times = List.DateTimes(#"Removed Columns1"[#"Date/Time"]{0}, 
                                                        Duration.TotalSeconds(#"Removed Columns1"[#"Date/Time"]{1}-#"Removed Columns1"[#"Date/Time"]{0})+1,
                                                        #duration(0,0,0,1)), IDX = 0],
                            each [IDX] < Table.RowCount(#"Removed Columns1"),
                            each [times = List.DateTimes(#"Removed Columns1"[#"Date/Time"]{[IDX]+2}, 
                                                        Duration.TotalSeconds(#"Removed Columns1"[#"Date/Time"]{[IDX]+3}-#"Removed Columns1"[#"Date/Time"]{[IDX]+2})+1,
                                                        #duration(0,0,0,1)), IDX = [IDX]+2],
                            each [times]
                                    )
                            ),

//filter the table using the list
filterTimesCol = Table.FromList(filterTimes,Splitter.SplitByNothing()),
filteredTable = Table.Join(#"Changed Type","Date/Time",filterTimesCol,"Column1",JoinKind.Inner),
    #"Removed Columns" = Table.RemoveColumns(filteredTable,{"Column1"}),
    #"Added Custom1" = Table.AddColumn(#"Removed Columns", "Custom", each DateTime.ToText([#"Date/Time"],"dd-MMM-yy")),
    #"Filtered Rows2" = Table.SelectRows(#"Added Custom1", each [#"Date/Time"] > #datetime(2019, 01, 01, 0, 0, 0)),
    #"Sorted Rows" = Table.Sort(#"Filtered Rows2",{{"Date/Time", Order.Ascending}})
in
    #"Sorted Rows"

I set up the below to return a sorted table with all results between the start and ending date/times.我在下面设置了一个排序表,其中包含开始日期/时间和结束日期/时间之间的所有结果。 You can then select the first or middle or bottom row of each table if you want from this point.然后,如果需要,您可以 select 每个表的第一行、中间行或底部行。 Its hard to tell from your question if you are looking for the value closest to the start value, closest to the end value or something inbetween.如果您正在寻找最接近起始值、最接近结束值或介于两者之间的值,很难从您的问题中判断出来。 You can wrap my Table.Sort with a Table.FirstN or Table.LastN to pick up the first or last row.您可以用 Table.FirstN 或 Table.LastN 包装我的 Table.Sort 以获取第一行或最后一行。

I left most of your starting code alone我留下了你的大部分起始代码

let Source = Table.Buffer(T1),
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Date/Time", type datetime}, {"P7 [mbar]", Int64.Type}}),
//get start/stop times table
Source2 = T2,
typeIt = Table.TransformColumnTypes(Source2, {"Date/Time", type datetime}),
#"Filtered Rows" = Table.SelectRows(typeIt, each ([#"Date/Time"] <> null)),
#"Added Index" = Table.AddIndexColumn(#"Filtered Rows", "Index", 0, 1),
// shift Info up one row for comparison
    shiftedList = List.RemoveFirstN(  #"Added Index"[Info],1),
    custom1 = Table.ToColumns(  #"Added Index") & {shiftedList},
    custom2 = Table.FromColumns(custom1,Table.ColumnNames(  #"Added Index") & {"NextInfo"}),
#"Filtered Rows2" = Table.SelectRows(custom2, each not (Text.Contains([Info],"start", Comparer.OrdinalIgnoreCase) and Text.Contains([NextInfo],"start", Comparer.OrdinalIgnoreCase))),
#"Added Custom3" = Table.AddColumn(#"Filtered Rows2", "Type", each if Text.Contains(Text.Lower([Info]),"start") then "start" else if Text.Contains(Text.Lower([Info]),"finished") then "finished" else null),
 #"Removed Columns2" = Table.RemoveColumns(#"Added Custom3",{"Info", "NextInfo"}),
#"Added Custom1" = Table.AddColumn(#"Removed Columns2", "Custom", each if [Type]="start" then [Index] else null),
#"Filled Down" = Table.FillDown(#"Added Custom1",{"Custom"}),
#"Removed Columns" = Table.RemoveColumns(#"Filled Down",{"Index"}),
#"Pivoted Column" = Table.Pivot(#"Removed Columns", List.Distinct(#"Removed Columns"[Type]), "Type", "Date/Time"),
#"Added Custom2" = Table.AddColumn(#"Pivoted Column","Table",(i)=>Table.Sort(Table.SelectRows(T1, each [#"Date/Time"]>=i[start] and [#"Date/Time"]<=i[finished]),{{"Date/Time", Order.Ascending}}) , type table )
in #"Added Custom2"

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Expression.Error 枚举中没有足够的元素来完成操作。 电量查询 - Expression.Error There weren't enough elements in the enumeration to complete the operation. power query Expression.Error电源查询EXCEL - Expression.Error Power Query EXCEL Power Query Excel 如何跨过 Expression.Error - Power Query Excel how to step over Expression.Error Power Query Expression.Error:日期值必须包含日期组件。 详细信息:43831 - Power Query Expression.Error: The Date value must contain the Date component. Details: 43831 Expression.Error 找不到记录的字段“xxxx” - Expression.Error The field 'xxxx' of the record wasn't found Expression.Error:我们不能将运算符 > 应用于类型 List 和 Number - Expression.Error: We cannot apply operator > to types List and Number 将Teradata SQL查询(带列别名)动态传递给ODBC查询时的Expression.Error - Expression.Error when dynamically passing in Teradata SQL query (with column aliases) to ODBC query Expression.Error:无法识别名称“ Text.BeforeDelimiter”。 Excel 2016 - Expression.Error: The name 'Text.BeforeDelimiter' wasn't recognized. Excel 2016 为什么此Power Query操作需要这么多时间才能完成? - Why does this Power Query operation take so much time to complete? 运行时错误“1004”:[Expression.Error] 无法识别名称“源”。 确保拼写正确 - Run-time error '1004':[ Expression.Error] The name 'Source' wasn't recognized. Make sure it's spelled correctly
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM