一起学微软Power BI系列-使用技巧(5)自定义PowerBI时间日期表
1.日期函数表作用
经常使用Excel或者PowerBI,Power Pivot做报表,时间日期是一个重要的纬度,加上做一些钻取,时间日期函数表不可避免。所以今天就给大家分享一个自定义的做日期表的方法,当然自己使用Excel用公式做一个也很快,八仙过海各显神通。我对C#比较了解,就用自己最了解的方式做了一个。大家可以自己扩充,或者可以把需求提供我,我统一完善。比如下面这个表(来自一个Power Pivot课程)。
本文原文地址:http://www.cnblogs.com/asxinyu/p/Power_BI_Skills_DateTime_Table.html
因为日期函数表主要在建模的时候进行关联,所以是比较固定的,不像业务数据会变动,所以根据所在项目的特殊情况,一次性生成一个时间段的数据足够用了,大不了,更新一下。那先看看我们初级版的日期函数表的结构。
2.日期函数表结构
我这里做的格式主要是和上图基本一直,把年份,月份,星期,,季度,月度第N天,年度第N天进行了计算。计算过程都比较简单,都在C#中完成。
3.代码实现过程
数据库设计,如果大家有新增需求,直接可以在源代码的“时间日期表.cs”修改即可,注意格式。如果熟悉XCode的同学,当然是轻车熟路。由于当初设计已经很久了,XML文件已经找不到了,否则更方便。
代码很简单就2个主要方法,在“时间日期表.Biz.cs”中的GenerateTable中,上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | /// <summary> /// 从指定的日期开始,生成指定天数的时间日期表 /// </summary> /// <param name="date">起始日期</param> /// <param name="days">生成的天数,一般一次性生成个前后5年差不多了</param> public static void GenerateTable(DateTime date, int days) { int i = 0; string [] Day = new string [] { "星期日" , "星期一" , "星期二" , "星期三" , "星期四" , "星期五" , "星期六" }; EntityList<DateTimePeriod> list = new EntityList<DateTimePeriod>(); while (i < days) { var model = new DateTimePeriod(); model.STAT_DATE = date; model.DATES = Convert.ToInt32(date.ToString( "yyyyMMdd" )); model.YEAR_MONTH = Convert.ToInt32(date.ToString( "yyyyMM" )); model.YEAR = ( short )date.Year; model.MONTH = date.Month.ToString() + "月" ; int week = Convert.ToInt32(model.STAT_DATE.DayOfWeek); model.WEEK = Day[week]; model.QUARTER = ( short )Math.Ceiling(date.Month / 3.1); //季度数,向上取整 model.DAYS_MONTH = ( short )date.Day; model.DAYS_YEAR = ( short )date.DayOfYear; model.DAYS_WEED = ( short )(week == 0 ? 7 : week); model.MONTH_YEAR = ( short )date.Month; model.WEEK_YEAR = ( short )GetWeekOfYear(date); list.Add(model); i++; date = date.AddDays(1); } list.Save( true ); } /// <summary> /// 该日期是每年中的第几周 /// </summary> /// <param name="date"></param> /// <returns></returns> private static int GetWeekOfYear(DateTime date) { //一.找到第一周的最后一天(先获取1月1日是星期几,从而得知第一周周末是几) int firstWeekend = 7 - Convert.ToInt32(DateTime.Parse(date.Year + "-1-1" ).DayOfWeek); //二.获取今天是一年当中的第几天 int currentDay = date.DayOfYear; //三.(今天 减去 第一周周末)/7 等于 距第一周有多少周 再加上第一周的1 就是今天是今年的第几周了 // 刚好考虑了惟一的特殊情况就是,今天刚好在第一周内,那么距第一周就是0 再加上第一周的1 最后还是1 return Convert.ToInt32(Math.Ceiling((currentDay - firstWeekend) / 7.0)) + 1; } |
在控制台中执行该方法,可以在bin目录中找到"时间日期表.db",生成的数据就在里面,因为我习惯了使用sqlite文件,大家可以自己导出文件到excel,我在后面提供了工具下载,和Excel版本,会程序的朋友改一改,挺快。
注意配置文件的连接字符串名称不能随便修改好,当然也可以生成到其他数据库,不过貌似都没必要。
4.资源
代码打包:时间日期表C#代码.rar
数据库文件(2010年-2020年):时间日期表Sqlite数据库.rar
Excel文件下载(2010年-2020年):时间日期表Excel.rar
微软Power BI技术交流群: 564786745 (验证注明:博客园Power BI)
技术博客:http://www.cnblogs.com/asxinyu/
论坛讨论区:http://www.newlifex.com/
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
.NET数据挖掘与机器学习,作者博客: http://www.cnblogs.com/asxinyu
E-mail:1287263703@qq.com
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库