繁体   English   中英

如何使用数据提取月份并在 Excel Power Query 中找到第 n 个值作为起点和第 n 个值作为终点,可能是 VBA

[英]How to extract months with data and find n-th value as starting point and n-th value as ending point in Excel Power Query, maybe VBA

我有一个由日期/时间、压力和自定义列组成的数据集。 这代表了压力随时间的数据,我想知道我的起点(5 分钟后)和一个月内最后一个值(行)之前的终点。 为了帮助您,通常测量大约需要 30-40 分钟,您可以在此示例中看到。 因此,这意味着数据量可能会有所不同。

时间列使用以下公式计算:

=([@[Date/Time]]-I5)*1440+L5

该数据集表示整个数据和所有带有值的月份,我需要使用这些起始/结束点分隔(过滤)月份,如屏幕截图所示。 我经常使用 Power Query 来处理数据,但也许还有另一种方法可以获取这些值……并在可能的情况下使它们动态化以用于未来的数据。

在此处输入图像描述

我还将上传带有整个数据集(所有月份)的虚拟工作簿,如果需要您的信息和测试,可以使用月份过滤表。

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

根据您共享的工作簿和您所写的内容,似乎对于任何给定的月份,您

  • 在排除该月的第一个条目后开始计算分钟数。
    • 如果这是一个错字/错误,只需删除删除第一行的 function
  • 第二个条目 = 0 分钟,返回第 5 分钟的第一个条目以及表中倒数第二个条目。
  • 请注意,我只从日期压力列开始

算法

  • 添加一列monthYear
  • monthYear
    • 自定义聚合到
      • 删除表格的第一行和最后一行
      • 与每月的第一次相比,创建一个以分钟为单位的持续时间列表。 这将是一分钟 + 一分钟的几分之一
      • 将该列表作为列添加到原始表中
      • 确定第五分钟的第一个条目
      • 确定最后一个条目
      • 过滤月份子表以返回这两个条目。

如果您只想查看给定月份的结果,可以在生成的 Excel 表中过滤结果。

M代码
请阅读评论并检查应用步骤以更好地理解算法

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Date/Time", type datetime}, {"P7 [mbar]", Int64.Type}}),

//add month/year column for grouping
    #"Added Custom" = Table.AddColumn(#"Changed Type", "month Year", 
        each Number.ToText(Date.Month([#"Date/Time"]),"00") & Number.ToText(Date.Year([#"Date/Time"]),"0000")),
    #"Grouped Rows" = Table.Group(#"Added Custom", {"month Year"}, {
        //elapsed minutes column
        {"Elapsed Minutes", (x)=> let

        //remove first and last rows from table  
            t=Table.RemoveColumns(Table.RemoveFirstN(Table.RemoveLastN(x)),"month Year"),

        //add a column with the elapsed minutes
            TableToFilter = Table.FromColumns(
                Table.ToColumns(t) 
                & {List.Generate(
                    ()=>[em=null, idx=0],
                    each [idx]< Table.RowCount(t),
                    each [em=Duration.TotalMinutes(t[#"Date/Time"]{[idx]+1} - t[#"Date/Time"]{0}), idx=[idx]+1],
                    each [em])}, type table[#"Date/Time"=datetime, #"P7 [mbar]"=number, elapsed=number]),

        //filter for last entry (which would be next to last in the month
            maxMinute = List.Max(TableToFilter[elapsed]),

        //filter for first entry in the 5th minute
            fifthMinute = List.Select(TableToFilter[elapsed], each Number.IntegerDivide(_,1)=5){0},

        //select the 5th minute and the last row
            FilteredTable = Table.SelectRows(TableToFilter, each [elapsed]=fifthMinute or [elapsed]=maxMinute)
            in FilteredTable,type table[#"Date/Time"=datetime, #"P7 [mbar]"=number, elapsed=number]}
            }),

    //remove uneeded column and expand the others
    #"Removed Columns" = Table.RemoveColumns(#"Grouped Rows",{"month Year"}),
    #"Expanded Elapsed Minutes" = Table.ExpandTableColumn(#"Removed Columns", "Elapsed Minutes", {"Date/Time", "P7 [mbar]"}, {"Date/Time", "P7 [mbar]"})
in
    #"Expanded Elapsed Minutes"

共享工作簿数据的结果
在此处输入图像描述

暂无
暂无

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM