我在Excel中有3个时间段 - 我需要知道最长连续时间段的持续时间

2024-04-07

请帮忙!

理想情况下,我真的很想仅使用公式来解决这个问题 - 而不是 VBA 或任何我认为“花哨”的东西。

我所工作的项目为持续参与提供奖金。我们有三个(有时更多)参与时间段,这些时间段可能会重叠和/或可能有没有参与的空间。神奇的数字是 84 天的持续参与。我们一直在手动审查每行(数百行),看看时间段加起来是否达到 84 天的连续参与,没有不活动的时期。

链接中有一张我们工作内容摘要的图片。例如,第 3 行在 3 个时间段中的任何一个时间段中都没有 84 天,但前 2 个时间段的总和包括 120 个连续天。日期不会按日期顺序显示 - 例如早期约定可能会列在第 3 期中。

真诚期待您的建议。

Annie


@TomSharpe 向您展示了一种用公式解决此问题的方法。如果您的时间段超过三个,则必须对其进行修改。

不确定您是否会认为 Power Query 解决方案“太花哨”,但它确实允许无限数量的时间段,如示例中所示。

有了 PQ,我们

  • 为每对开始/结束构建所有连续日期的列表
  • 合并每行的列表,删除重复项
  • 对每行的结果日期列表应用间隙和岛技术
  • 计算每个“岛”的条目数并返回最大值

请注意:我计算了开始日期和结束日期。在你的日子专栏中,你没有(除了一个例子)。如果您想同时计算两者,请保留代码不变;如果您不这样做,我们可以做一些小的修改

使用 Power Query

  • 创建一个表,其中excludes第一行合并单元格
  • 按照屏幕截图中显示的格式重命名表列,因为表中的每个列标题必须具有不同的名称。
  • 选择该数据表中的某个单元格
  • Data => Get&Transform => from Table/Range
  • 当 PQ 编辑器打开时:Home => Advanced Editor
  • 记下表格Name2号线
  • 将下面的 M 代码粘贴到您所看到的位置
  • 将第 2 行中的表名称更改回最初生成的名称。
  • 阅读评论并探索Applied Steps为了更好地理解算法

M Code
编辑代码以对日期列表进行排序以处理某些情况

let
    Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Start P1", type datetime}, {"Comment1", type text}, {"End P1", type datetime}, {"Days 1", Int64.Type}, {"Start P2", type datetime}, {"Comment2", type text}, {"End P2", type datetime}, {"Days 2", Int64.Type}, {"Start P3", type datetime}, {"Comment3", type text}, {"End P3", type datetime}, {"Days 3", Int64.Type}}),

//set data types for columns 1/5/9... and 3/7/11/... as date
dtTypes = List.Transform(List.Alternate(Table.ColumnNames(#"Changed Type"),1,1,1), each {_,Date.Type}),
typed = Table.TransformColumnTypes(#"Changed Type",dtTypes),

//add Index column to define row numbers
rowNums = Table.AddIndexColumn(typed,"rowNum",0,1),

//Unpivot except for rowNum column
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(rowNums, {"rowNum"}, "Attribute", "Value"),

//split the attribute column to filter on Start/End => just the dates
//then filter and remove the attributes columns
    #"Split Column by Delimiter" = Table.SplitColumn(#"Unpivoted Other Columns", "Attribute", Splitter.SplitTextByEachDelimiter({" "}, QuoteStyle.Csv, false), {"Attribute.1", "Attribute.2"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"Attribute.1", type text}, {"Attribute.2", type text}}),
    #"Removed Columns" = Table.RemoveColumns(#"Changed Type1",{"Attribute.2"}),
    #"Filtered Rows" = Table.SelectRows(#"Removed Columns", each ([Attribute.1] = "End" or [Attribute.1] = "Start")),
    #"Removed Columns1" = Table.RemoveColumns(#"Filtered Rows",{"Attribute.1"}),
    #"Changed Type2" = Table.TransformColumnTypes(#"Removed Columns1",{{"Value", type date}, {"rowNum", Int64.Type}}),

//group by row number
//generate date list from each pair of dates
//combine into a single list of dates with no overlapped date ranges for each row
    #"Grouped Rows" = Table.Group(#"Changed Type2", {"rowNum"}, {
        {"dateList", (t)=> List.Sort(
            List.Distinct(
                List.Combine(
                    List.Generate(
                        ()=>[dtList=List.Dates(
                                t[Value]{0},
                                Duration.TotalDays(t[Value]{1}-t[Value]{0})+1 ,
                                #duration(1,0,0,0)),idx=0],
                        each [idx] < Table.RowCount(t),
                        each [dtList=List.Dates(
                                    t[Value]{[idx]+2},
                                    Duration.TotalDays(t[Value]{[idx]+3}-t[Value]{[idx]+2})+1,
                                    #duration(1,0,0,0)),
                                idx=[idx]+2],
                        each [dtList]))))}
            }),

//determine Islands and Gaps
    #"Expanded dateList" = Table.ExpandListColumn(#"Grouped Rows", "dateList"),

//Duplicate the date column and turn it into integers
    #"Duplicated Column" = Table.DuplicateColumn(#"Expanded dateList", "dateList", "dateList - Copy"),
    #"Changed Type3" = Table.TransformColumnTypes(#"Duplicated Column",{{"dateList - Copy", Int64.Type}}),

//add an Index column
//Then subtract the index from the integer date
// if the dates are consecutive the resultant ID column will => the same value, else it will jump
    #"Added Index" = Table.AddIndexColumn(#"Changed Type3", "Index", 0, 1, Int64.Type),
    #"Added Custom" = Table.AddColumn(#"Added Index", "ID", each [#"dateList - Copy"]-[Index]),
    #"Removed Columns2" = Table.RemoveColumns(#"Added Custom",{"dateList - Copy", "Index"}),

//Group by the date ID column and a Count will => the consecutive days
    #"Grouped Rows1" = Table.Group(#"Removed Columns2", {"rowNum", "ID"}, {{"Count", each Table.RowCount(_), Int64.Type}}),
    #"Removed Columns3" = Table.RemoveColumns(#"Grouped Rows1",{"ID"}),

//Group by the Row number and return the Maximum Consecutive days
    #"Grouped Rows2" = Table.Group(#"Removed Columns3", {"rowNum"}, {{"Max Consecutive Days", each List.Max([Count]), type number}}),

//combine the Consecutive Days column with original table
    result = Table.Join(rowNums,"rowNum",#"Grouped Rows2","rowNum"),
    #"Removed Columns4" = Table.RemoveColumns(result,{"rowNum"})
in
    #"Removed Columns4"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我在Excel中有3个时间段 - 我需要知道最长连续时间段的持续时间 的相关文章

  • Excel 工作表到 iPhone 数据 -- A 点到 B 点

    尽可能简单 我有一个非常简单的 Excel 电子表格 只有 1000 多条记录 我想将其用作 iPhone 应用程序的静态数据源 最好的进攻计划是什么 我心中的可能性 1 直接读取XLS作为数据源 是否有Obj C库用于此 2 将XLS 转
  • Excel 在“.xls”中发现不可读的内容。同时导出水晶报表到excel

    我正在将数据从 Crystal 报告导出到 PDF 工作正常 并显示所有记录 但是当我将其导出到 Excel 文件中并成功导出时 以及当我在 Excel 中打开它时给出错误消息 文件错误 数据可能已丢失 当我点击 确定 按钮时 在 Exce
  • 由于直接引用范围而不是通过中间变量而导致 Excel VBA 运行时错误 450

    当我尝试直接引用某个范围内的值时 出现运行时错误 450 但如果我使用中间变量 它就会起作用 我不明白为什么 所以我担心在将来的某个时候我会再次遇到错误而不知道为什么 我尝试过使用 With End With 块 但当我直接引用范围时它仍然
  • 请求完成时间大于 ActiveRecord 和 View 时间之和

    以下是一些示例请求完成时间 Completed 200 OK in 1054ms Views 10 8ms ActiveRecord 455 6ms Completed 200 OK in 1410ms Views 11 6ms Activ
  • 选择在 Excel 宏(VBA 中的范围对象)中具有值的列

    如何修改 VBA 中的这一行以仅选择具有值的列 Set rng Range A1 Range A65536 End xlUp SpecialCells xlCellTypeVisible 我不认为我做的事情是正确的CountLarge财产是
  • 如何在未安装 Office 的情况下以编程方式创建、读取、写入 Excel?

    我对所有读取 写入 创建 Excel 文件的方法感到非常困惑 VSTO OLEDB 等 但它们都seem具有必须安装office的要求 这是我的情况 我需要开发一个应用程序 它将以 Excel 文件作为输入 进行一些计算并创建一个新的 Ex
  • 如何向 Time.now 添加两周?

    如何在 Ruby 中向当前 Time now 添加两周 我有一个使用 DataMapper 的小型 Sinatra 项目 在保存之前 我有一个字段填充了当前时间加上两周 但未按需要工作 任何帮助是极大的赞赏 我收到以下错误 NoMethod
  • 让 hudson 将源签出到特定目录

    这似乎是一个简单的任务 但在我的一生中 我无法让 Hudson 将我的源代码签出到特定目录 我可以在命令行上使用 svn 查看源代码 我尝试在源代码管理下指定本地模块设置 但没有骰子 我将其设置为 c source trunk 并在运行构建
  • Android 无法解析日期异常

    当尝试解析发送到我的 Android 客户端的日期字符串时 我得到一个无法解析的日期 这是例外 java text ParseException 无法解析的日期 2018 09 18T00 00 00Z 位于 偏移量 19 在 java t
  • 返回上个月的日期时间对象

    如果 timedelta 在它的构造函数中有一个月份参数就好了 那么最简单的方法是什么 EDIT 正如下面指出的那样 我并没有认真考虑这一点 我真正想要的是上个月的任何一天 因为最终我只会获取年份和月份 因此 给定一个日期时间对象 返回的最
  • 如何在python中转换1970年之前的日期

    我写了一个方法来处理 mongodb 结果 其中日期为datetime datetime i used dumps方法 该方法将日期转换为不是毫秒 这里如果日期在 1970 年之前 则日期将转换为负值 我无法处理此问题以更改回 1970 年
  • 使用 pythoncom 在 Python 进程之间编组 COM 对象

    我希望有人可以帮助我从 Python 进行编组跨进程调用到 Excel 我有一个通过 Python 启动的 Excel 会话 我知道当需要从单独的 Python 进程访问它时 该会话将会启动并运行 我已经使用编组让一切按预期工作CoMars
  • 在java中将字符串日期转换为美国格式

    我有下面的代码 其中日期为字符串类型 我必须将其设置为美国格式 所以下面我已经展示了它 private static final SimpleDateFormat usOutputDate new SimpleDateFormat MM d
  • 根据单元格值向用户窗体添加复选框

    我对 VBA 很陌生 只有 3 天 但我发现它非常有用且易于使用 但现在我面临一个问题 我需要制作一个具有不同复选框的用户窗体 但我需要根据工作表某一列中使用的信息自动添加它们 我相信我可以使用 For Each Next 但我真的不知道如
  • 有没有更好的方法将 UTC 时间转换为大纪元时间?

    我想将文件的修改时间设置为从 exif 数据获取的时间 为了从 exif 获取时间 我发现 Graphics Exif getTag Exif gt String gt IO Maybe String 要设置文件修改时间 我发现 Syste
  • 如何使用VBA根据条件删除Excel中的行?

    我目前正在构建一个宏来格式化数据表并删除不适用的数据行 具体来说 我希望删除列 L ABC 的行以及删除列 AA DEF 的行 到目前为止 我已经实现了第一个目标 但还没有实现第二个目标 现有代码是 Dim LastRow As Integ
  • 如何在 python 中使用 urllib2 加快获取页面的速度?

    我有一个脚本可以获取多个网页并解析信息 一个例子可以在 我在上面运行了 cProfile 正如我所假设的 urlopen 占用了很多时间 有没有办法更快地获取页面 或者一次获取多个页面的方法 我会做最简单的事情 因为我是 python 和网
  • 有没有办法改变输入类型=“日期”格式?

    默认情况下 输入type date 显示日期为YYYY MM DD 问题是 是否可以将其格式强制为 DD MM YYYY 无法更改格式 我们必须区分有线格式和浏览器的表示格式 接线格式 The HTML5日期输入规范 https www w
  • 文件夹.文件的相对路径

    我有一个 Excel 文件 在同一文件夹中还有一个包含我想要包含的 CSV 文件的文件夹 使用 来自文件夹 查询 第一步将给出以下查询 Folder Files D OneDrive Documents Health Concept2 现在
  • 将日期差转换为年数以计算 MongoDB 中的年龄

    我正在使用以下方法来计算时间戳差异中的年龄 db getCollection person aggregate project item 1 DOB personal DOB dateDifference subtract new Date

随机推荐

  • iOS - 无法使用 CIFilter 处理图像

    我正在尝试使用 Core Image 处理图像 我创建了 UIImage 类别来做到这一点 我已经添加了石英芯 and 核心图像项目框架 导入CoreImage CoreImage h并使用了这段代码 CIImage inputImage
  • Soap 响应,XML 格式不正确,未找到 XOP 部分,使用 WSE

    我正在使用一个 Web 服务 在该服务中我发送带有附件的请求 然后我们收到来自服务器的包含各种信息的响应 我已经在另一个问题中记录了将请求放在一起的一些问题向 SOAP 请求添加附件 https stackoverflow com ques
  • ember 中可重用对象的架构

    我正在使用 ember 构建一个管理仪表板 我想创建一个可重用的图表对象 我可以在整个应用程序中拥有多个实例 图表对象应该有一个由一些标记和一个画布元素组成的模板 在插入 DOM 后我需要其 id 以便附加实际的图表 chart js 我尝
  • 显示 ModelForms 的 django 表单验证错误

    我经常发现自己在视图中使用 ModelForm 来显示和转换视图 我在模板中显示表单没有任何问题 我的问题是 当我使用这些表单时 表单通常不会使用 is valid 方法进行验证 问题是我不知道是什么导致了验证错误 这是视图中的基本示例 d
  • 无法从程序集“Microsoft.EntityFrameworkCore”加载类型“Microsoft.EntityFrameworkCore.Metadata.Internal.IEntityMaterializer”

    我正在尝试将我的 mvc 核心应用程序连接到现有的 ms access 数据库 大致如下本指南 https learn microsoft com en us ef core get started aspnetcore existing
  • 不使用子域时通配符 SSL 证书会生成错误

    我有一个带有 mydomain com SSL 证书的网络服务器 IIS 这非常适合https anysubdomain mydomain com https anysubdomain mydomain com 但要去https mydom
  • 如何使用 jQuery 获取元素的名称?

    如何使用 jQuery 获取 HTML 元素的 name 属性 你应该使用attr name 像这样 yourid attr name 你应该使用 id 选择器 如果你使用类选择器 你会遇到问题 因为返回了一个集合
  • Flutter实现重复弹性动画

    为了实现这个动画 我写了下面的代码 但是 弹性动画在项目中不起作用 我不确定有什么问题 我想重复这个动画 import package flutter material dart void main gt runApp MaterialAp
  • 为什么 nhibernate 需要 Log4Net?

    我将使用 asp net mvc3 和 nhibernate 3 2 构建我的应用程序 我决定使用 Elmah 记录所有错误消息 我记得 nhibernate 支持 log4net 并用它来记录所有查询 如果我不关心将查询输出到日志文件 我
  • 将参数传递给 pentaho CDE 报告

    我在此报告中创建了一个 CDE 参数报告 我想通过 url 传递参数 我的 CDE 报告链接如下 http localhost 8080 pentaho content pentaho cdf dd Render solution demo
  • 如何从该函数中获取函数名称?

    如何从函数内部访问函数名称 parasitic inheritance var ns parent child function var parent new ns parent parent newFunc function return
  • 如何使用 afconvert 将 .caf 转换为 .mp3 格式? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 afconvert 命令行实用程序来转换音频文件 caf to mp3格式 我用过afconvert afconvert f
  • Android 帐户验证器编辑电子邮件 ID 凭据

    当我登录时 电子邮件受保护 cdn cgi l email protection在我的应用程序中 它使用我的电子邮件成功生成帐户 如下所示 现在我注销并使用不同的电子邮件登录 例如 电子邮件受保护 cdn cgi l email prote
  • 在 bash 中对退出代码进行 AND 运算

    我有一个 bash 脚本 它对我的 源代码运行三项检查 然后exit 0如果所有命令都成功 或者exit 1如果其中任何一个失败 bin bash test1 src test 1 option exit 1 test2 src test
  • Shell_NotifyIconA / Shell_NotifyIconW ...有什么区别?

    我正在将一些 Win32 代码移植到 C 并且遇到了几个具有相同名称并使用相同结构的函数 只是它们以 A 和 W 结尾 例如 return MarshalAs UnmanagedType Bool DllImport shell32 dll
  • 嵌套类定义在外部类之外,而外部类包含内部类的实例

    C 如何将内部 嵌套 类的定义放在其外部 封闭 类的定义之外 其中外部类至少有一个内部类实例作为数据成员 我搜索了但我找到的最相关的答案 源文件中的嵌套类定义 https stackoverflow com questions 448200
  • 我的应用程序由于 Android 上的权限问题而终止

    我正在编写这段代码来获取 GPS 位置 我已经 在 Android 属性上标记了 ACCESS COARSE LOCATION 和 ACCESS FINE LOCATION 我还确认了它是否在 AndroidManifest xml 中 但
  • 关闭键盘 - iOS 7 中的多个 UITextField

    下面您将找到我的主视图控制器的 h 和 m 文件 我有 3 个问题 1 因为我有多个 uitextfields 我是否必须为每个字段设置自己的 resignFirstResponder 语句 2 我会在哪里 用什么方法做到这一点 3 我辞去
  • UIButton 第一次点击后不可点击

    我试图在单击按钮时从底部引入一个子视图 但只有第一次该按钮是可点击的 动画按钮后第二次单击不可单击 这是代码 class AnimateView UIView var button UIButton var menuView UIView
  • 我在Excel中有3个时间段 - 我需要知道最长连续时间段的持续时间

    请帮忙 理想情况下 我真的很想仅使用公式来解决这个问题 而不是 VBA 或任何我认为 花哨 的东西 我所工作的项目为持续参与提供奖金 我们有三个 有时更多 参与时间段 这些时间段可能会重叠和 或可能有没有参与的空间 神奇的数字是 84 天的