ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: deadzlq

[分享] 工业用电的分时段用时问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-9-27 07:11 来自手机 | 显示全部楼层
ThxAlot 发表于 2024-9-27 05:50
没觉得拆秒会不行。。。



老师,能不能按你的思路做个 我学习一下。不要用递归就行

TA的精华主题

TA的得分主题

发表于 2024-9-27 08:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
ThxAlot 发表于 2024-9-27 05:50
没觉得拆秒会不行。。。

Talk is cheap, show me your code!
按你的思路来,看能不能把3年的数据跑进3秒,让我学习一下。
9楼的方法可以跑进3秒,递归也快,但受限于堆栈大小,溢出是正常的,我也有方法延迟堆栈溢出。

TA的精华主题

TA的得分主题

发表于 2024-9-27 11:27 来自手机 | 显示全部楼层
飞天篮球猪 发表于 2024-9-27 08:17
Talk is cheap, show me your code!
按你的思路来,看能不能把3年的数据跑进3秒,让我学习一下。
9楼的 ...


牛逼克拉斯。 函数区的 超级玛莉64 和 PQ区的你,是我觉得都特牛的大神,印象深刻

TA的精华主题

TA的得分主题

发表于 2024-9-27 16:06 | 显示全部楼层
cnmlgb9998 发表于 2024-9-27 07:11
老师,能不能按你的思路做个 我学习一下。不要用递归就行

这样写出来看上去肯定是繁琐些,但性能几乎是恒定的,不管时间间隔是1天还是10年,也不存在什么stack溢出的情况。
  1. // DIV
  2. let
  3.     Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WerFhu5KOkoGBFRjVGVhAGEqxOtFKT3duBslBheoMDZDlNm8AysGE6gwNkeU2TAPJGcLkjDDMhAnVGZpgmmkCkzPFNNMUJmeOqc8cJmeJaR9UqM7I2MrUEoiUYmMB", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [时段 = _t, 起止时间 = _t]),
  4.     #"Changed Type" = Table.TransformColumnTypes(Source,{{"时段", type text}, {"起止时间", type text}}),

  5.     Periods = Table.TransformColumns(
  6.         #"Changed Type",
  7.         {"起止时间", each let l=List.Transform(Text.Split(_,"~"), Time.From), dur=Number.Round(Duration.TotalMinutes(l{1}-l{0})) in List.Transform({0..dur-1}, each l{0}+#duration(0,0,_,0))}
  8.     ),
  9.     Grouped = Table.Group(Periods, "时段", {"grp", each List.Combine([起止时间])}),
  10.     #"To Records" = Table.ToRecords(Grouped)
  11. in
  12.     #"To Records"

  13. // elec
  14. let
  15.     Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("ZYzBDcAgDMRWQXkjkUtIgayCsv8aQOmvT1uW56RRpAhLTc2lUd6slx9Hp8inUL5K1K3vBlzwi45BTWAXez/4xhhuRhEL", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"Start DT" = _t, #"End DT" = _t]),
  16.     #"Changed Type" = Table.TransformColumnTypes(Source,{{"Start DT", type datetime}, {"End DT", type datetime}}),
  17.     #"Added whole day" = Table.AddColumn(
  18.         #"Changed Type",
  19.         "whole",
  20.         each let
  21.             d=Duration.TotalDays(Date.From([End DT])-Date.From([Start DT]))-1
  22.         in List.Transform(DIV, each Record.TransformFields(_, {"grp", each d*List.Count(_)}))
  23.     ),
  24.     #"Added Stt" = Table.AddColumn(
  25.         #"Added whole day",
  26.         "Stt",
  27.         each let
  28.             stt=Time.From([Start DT]),
  29.             dur=Number.Round(Duration.TotalMinutes(#time(23,59,59)-stt)),
  30.             l=List.Transform({0..dur-1}, each stt+#duration(0,0,_,0))
  31.         in List.Transform(DIV, each Record.TransformFields(_, {"grp", each List.Count(List.Intersect({l,_}))})), type list
  32.     ),
  33.     #"Added End" = Table.AddColumn(
  34.         #"Added Stt",
  35.         "End",
  36.         each let
  37.             end=Time.From([End DT]),
  38.             dur=Number.Round(Duration.TotalMinutes(end-#time(0,0,0))),
  39.             l=List.Transform({0..dur-1}, each end-#duration(0,0,_,0))
  40.         in List.Transform(DIV, each Record.TransformFields(_, {"grp", each List.Count(List.Intersect({l,_}))})), type list
  41.     ),
  42.     #"Combined Columns" = Table.CombineColumns(#"Added End", {"whole","Stt","End"}, each let t=Table.FromRecords(List.Combine(_)) in Table.Pivot(t, List.Distinct(t[时段]), "时段", "grp", List.Sum), "comb"),
  43.     #"Expanded comb" = Table.ExpandTableColumn(#"Combined Columns", "comb", {"谷", "平", "峰", "尖"})
  44. in
  45.     #"Expanded comb"
复制代码


Electricity.zip

15.32 KB, 下载次数: 4

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-9-27 16:33 | 显示全部楼层
飞天篮球猪 发表于 2024-9-27 08:17
Talk is cheap, show me your code!
按你的思路来,看能不能把3年的数据跑进3秒,让我学习一下。
9楼的 ...

呵呵,杠精你好,还是会拽English的,对对对,你说的都对


我们公司这边还在用一种叫PYTHON的古老编程语言去做一些处理和计算,论效率还算可以吧,不知道能不能跑进一秒;要么就是去写DAX公式。PQ的计算都不太上得了台面,还得另外付上文档说明以供后期维护。。。

TA的精华主题

TA的得分主题

发表于 2024-9-27 19:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
ThxAlot 发表于 2024-9-27 16:33
呵呵,杠精你好,还是会拽English的,对对对,你说的都对

大神:能不能用PQ,按你的思路解答一下?我想学学。谢谢!

TA的精华主题

TA的得分主题

发表于 2024-9-27 20:56 | 显示全部楼层
cnmlgb9998 发表于 2024-9-27 19:50
大神:能不能用PQ,按你的思路解答一下?我想学学。谢谢!

在发给你的回帖里贴了代码和附件,但是一直在审查状态。

现在试一下这个能不能直接出来
  1. // DIV
  2. let
  3.     Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WerFhu5KOkoGBFRjVGVhAGEqxOtFKT3duBslBheoMDZDlNm8AysGE6gwNkeU2TAPJGcLkjDDMhAnVGZpgmmkCkzPFNNMUJmeOqc8cJmeJaR9UqM7I2MrUEoiUYmMB", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [时段 = _t, 起止时间 = _t]),
  4.     #"Changed Type" = Table.TransformColumnTypes(Source,{{"时段", type text}, {"起止时间", type text}}),

  5.     Periods = Table.TransformColumns(
  6.         #"Changed Type",
  7.         {"起止时间", each let l=List.Transform(Text.Split(_,"~"), Time.From), dur=Number.Round(Duration.TotalMinutes(l{1}-l{0})) in List.Transform({0..dur-1}, each l{0}+#duration(0,0,_,0))}
  8.     ),
  9.     Grouped = Table.Group(Periods, "时段", {"grp", each List.Combine([起止时间])}),
  10.     #"To Records" = Table.ToRecords(Grouped)
  11. in
  12.     #"To Records"

  13. // elec
  14. let
  15.     Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("ZYzBDcAgDMRWQXkjkUtIgayCsv8aQOmvT1uW56RRpAhLTc2lUd6slx9Hp8inUL5K1K3vBlzwi45BTWAXez/4xhhuRhEL", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"Start DT" = _t, #"End DT" = _t]),
  16.     #"Changed Type" = Table.TransformColumnTypes(Source,{{"Start DT", type datetime}, {"End DT", type datetime}}),
  17.     #"Added whole day" = Table.AddColumn(
  18.         #"Changed Type",
  19.         "whole",
  20.         each let
  21.             d=Duration.TotalDays(Date.From([End DT])-Date.From([Start DT]))-1
  22.         in List.Transform(DIV, each Record.TransformFields(_, {"grp", each d*List.Count(_)}))
  23.     ),
  24.     #"Added Stt" = Table.AddColumn(
  25.         #"Added whole day",
  26.         "Stt",
  27.         each let
  28.             stt=Time.From([Start DT]),
  29.             dur=Number.Round(Duration.TotalMinutes(#time(23,59,59)-stt)),
  30.             l=List.Transform({0..dur-1}, each stt+#duration(0,0,_,0))
  31.         in List.Transform(DIV, each Record.TransformFields(_, {"grp", each List.Count(List.Intersect({l,_}))})), type list
  32.     ),
  33.     #"Added End" = Table.AddColumn(
  34.         #"Added Stt",
  35.         "End",
  36.         each let
  37.             end=Time.From([End DT]),
  38.             dur=Number.Round(Duration.TotalMinutes(end-#time(0,0,0))),
  39.             l=List.Transform({0..dur-1}, each end-#duration(0,0,_,0))
  40.         in List.Transform(DIV, each Record.TransformFields(_, {"grp", each List.Count(List.Intersect({l,_}))})), type list
  41.     ),
  42.     #"Combined Columns" = Table.CombineColumns(#"Added End", {"whole","Stt","End"}, each let t=Table.FromRecords(List.Combine(_)) in Table.Pivot(t, List.Distinct(t[时段]), "时段", "grp", List.Sum), "comb"),
  43.     #"Expanded comb" = Table.ExpandTableColumn(#"Combined Columns", "comb", {"谷", "平", "峰", "尖"})
  44. in
  45.     #"Expanded comb"
复制代码


评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-9-30 19:12 | 显示全部楼层
  1. let
  2.     源 = Excel.CurrentWorkbook(){[Name="Table15"]}[Content],
  3.     tab = Excel.CurrentWorkbook(){[Name="表5"]}[Content],
  4.     k=Table.TransformColumns(tab,{"起止时间",each [
  5.        a=Text.Split(Text.Replace(_,"24","1.00"),"~"),
  6.        b=Duration.From(a{0}),
  7.        c=Duration.FromText(a{1}),
  8.        d=c-b  
  9.              ]  }),
  10.     查询 = Table.ExpandRecordColumn(k, "起止时间", {"b", "c", "d"}),
  11.     ntol=List.Count(查询[时段]),//查询记录总数
  12.     c=List.Distinct(查询[时段]),
  13.     d=Record.FromList(List.Repeat({Duration.From(0)},List.Count(c)),c),//取查询行数,查询时间分类名称。
  14.     e=[a=0,b=Duration.From(0)] & d,//制作循环计数记录。
  15.     m=Table.ToList(源,each [
  16.          s=[a=Duration.From(Text.Split(Text.From(_{0})," "){1}),       b=_{1}-_{0}],//每条记录取初始时间与首尾差值
  17.          d=List.Generate(()=>e, (x)=>x[b]<=s[b],(y)=>[
  18.             p=if y[a]=0 then Table.RowCount(Table.SelectRows(查询,each s[a]>=[b]))-1 else y[a],
  19.             b=Number.Mod(p,ntol),
  20.             j=if y[a]=0 then  查询[c]{b}-s[a] else 查询[d]{b},
  21.             k=if y[b]=s[b] then s[b] else if s[b]-y[b]<j then s[b]-y[b] else j,
  22.             n=Record.TransformFields(y,{查询[时段]{b},each _+k}) & [a=p+1,b=y[b]+k]
  23.                ][n]),
  24.          f=List.Last(d)
  25.                      ][f] ),
  26.     extab =Table.SelectColumns(Table.FromRecords(m),c),
  27.     retab=Table.TransformColumns(extab,{},each if _>Duration.From(0) then Number.ToText(Duration.TotalMinutes(_),"f") else null)

  28. in
  29.     retab
复制代码

TA的精华主题

TA的得分主题

发表于 2024-9-30 19:16 | 显示全部楼层
cnmlgb9998 发表于 2024-9-27 19:50
大神:能不能用PQ,按你的思路解答一下?我想学学。谢谢!

[color=rgb(153, 153, 153) !important][url=]帖子[/url]搜索



ExcelHome技术论坛&#8250;论坛&#8250;Excel 技术交流与问答&#8250;Power BI&#8250;工业用电的分时段用时问题&#8250;参与/回复主题

RE: 工业用电的分时段用时问题 [[url=]修改[/url]]

cnmlgb9998 发表于 2024-9-27 19:50
大神:能不能用PQ,按你的思路解答一下?我想学学。谢谢!







工业用电分时段问题1.7z

17.7 KB, 下载次数: 3

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-10-11 18:35 | 显示全部楼层
我们公司只能用wps 你这个pq看着真复杂
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-21 19:27 , Processed in 0.037152 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表