学习电商数仓搭建时,遇到创建DIM层的时间维度表。这里时间维度表数据是十分固定的(一年一更新),要将这些数据提出出来生成文件以便导入DIM层的时间维度表中。

我们可以调用网络上免费的节假日API来实现对数据的整合和统计。

具体代码如下:

这里建议使用第二种getDate2的API,注意使用第二种时需要你自己去申请app_id和app_secret去替换

package com.time;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;/**** 制作时间维度表数据(日期,周,周几,每月第几天,第几月,第几季度,年,是否为鸽子肉,节假日)* @author csw* @time 2022/4/20 9:55*/
public class TimeProduce {static BufferedReader in = null;static BufferedWriter writer = null;public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\study\\data\\date.txt"), "UTF-8"));//        getDate1();getDate2();close();}/*** @Author: csn* @Description: 建立API调用连接* @DateTime: 2022/4/20 14:14* @Params:* @Return 字符串(日期数据)*/public static StringBuffer getConnect(String url) {URL url1;StringBuffer sb = new StringBuffer();try {url1 = new URL(url);HttpURLConnection connection = (HttpURLConnection) url1.openConnection();connection.setRequestMethod("GET");connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36)"); //防止报403错误。connection.connect();in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));String str;while ((str = in.readLine()) != null) {sb.append(str);}} catch (IOException e) {e.printStackTrace();}return sb;}/*** @Author: csn* @Description: 调用第一种API* @DateTime: 2022/4/20 14:14* @Params:* @Return*/public static void getDate1() {// API接口URLString url = "https://api.apihubs.cn/holiday/get?year=2022&cn=1&size=365";// 返回获取的字符串StringBuffer sb = getConnect(url);// 返回一个JSON对象(将JSON字符串转化为JSON对象)JSONObject jsonObject = JSONObject.parseObject(sb.toString());// 获取JSON字段为“data”的数据并将其返回为一个JSON对象JSONObject data = jsonObject.getJSONObject("data");// 返回JSON对象的一个(链表)对象JSONArray jsonArray = (JSONArray) data.get("list");// 遍历链表for (int i = 0; i < jsonArray.size(); i++) {// 获取时间(20220101)String t_date = jsonArray.getJSONObject(i).getString("date");// 获取年(2022)String year = jsonArray.getJSONObject(i).getString("year");// 截取月(01)int mouth = Integer.parseInt(t_date.substring(4, 6));// 截取日(01)int day = Integer.parseInt(t_date.substring(6, 8));// 将数据格式化String date = year + "-" + mouth + "-" + day;// 获取当前日期所在一周第几天String week = jsonArray.getJSONObject(i).getString("week");// 获取日期在本年的第几周String yearweek = jsonArray.getJSONObject(i).getString("yearweek").substring(4);String workday;String holiday;// 判断是否为工作日(是为“1”。反之为“0”)if ("工作日".equals(jsonArray.getJSONObject(i).getString("workday_cn"))) {workday = "1";} else workday = "0";// 是否为假期节假日(是则返回节假日名称,反之返回“\N”)if ("假期节假日".equals(jsonArray.getJSONObject(i).getString("holiday_recess_cn"))) {holiday = jsonArray.getJSONObject(i).getString("holiday_cn");} else holiday = "\\N";// 整理格式,写入文件String dates = date + "\t" + yearweek + "\t" + week + "\t" + day + "\t" + mouth + "\t" + year + "\t" + workday + "\t" + holiday;System.out.println(dates);try {writer.write(dates + "\n");writer.flush();} catch (IOException ex) {ex.printStackTrace();}}}public static void getDate2() {// 这里的API需要你去官网查看它的需求(app_id和app_secret需要你去申请替换)String url = " https://www.mxnzp.com/api/holiday//list/year/2022?ignoreHoliday=false&app_id=XXX&app_secret=XXX";StringBuffer buffer = getConnect(url);JSONObject jsonObject = JSONObject.parseObject(buffer.toString());
//        System.out.println(jsonObject);JSONArray jsonArray = jsonObject.getJSONArray("data");// 初始化季度(0)int quarter = 0;for (int i = 0; i < jsonArray.size(); i++) {
//            System.out.println(jsonArray.getJSONObject(i).getString("year"));// 年(2022)String year = jsonArray.getJSONObject(i).getString("year");// 月(1)String month = jsonArray.getJSONObject(i).getString("month");// 三月一季度(注意取模条件)if ( Integer.parseInt(month) % 3 == 1) {// 季度加一quarter++;}// 获取“days”字段JSON对象JSONArray jsonArray1 = jsonArray.getJSONObject(i).getJSONArray("days");for (int j = 0; j < jsonArray1.size(); j++) {// 日期(2022-01-01)String date = jsonArray1.getJSONObject(j).getString("date");// 一月第几天String[] strings = date.split("-");int day = Integer.parseInt(strings[2]);// 一年第几周(这里接口返回的是每年与每年之间是连接的,我们这里不需要连接就只要当前年开始就为1,那么就需要对数据进行处理)String weekOfYear = jsonArray1.getJSONObject(j).getString("weekOfYear");// 转化为整数类型int week = Integer.parseInt(weekOfYear) + 1;// 进行判断(一月份且周数大于10),满足就说明是上一年的那么就让他为1if ("1".equals(month) && week > 10) {week = 1;}// 一周第几天String weekDay = jsonArray1.getJSONObject(j).getString("weekDay");// 0 工作日 1 假日 2 节假日 (如果ignoreHoliday参数为true,这个字段不返回)String type = jsonArray1.getJSONObject(j).getString("type");String work;if ("0".equals(type)) {work = "1";}else work = "0";//  国庆,休息日,工作日 (如果ignoreHoliday参数为true,这个字段不返回)String typeDes = jsonArray1.getJSONObject(j).getString("typeDes");String holiday;if ("休息日".equals(typeDes) || "工作日".equals(typeDes)) {holiday = "\\N";}else holiday = typeDes;// 整合数据String data = date + "\t" + week + "\t" + weekDay + "\t" + day + "\t" + month + "\t" + quarter + "\t" + year + "\t" + work + "\t" + holiday;try {writer.write(data + "\n");writer.flush();} catch (IOException e) {e.printStackTrace();}System.out.println(data);}}}/*** @Author: csn* @Description: 关闭io流* @DateTime: 2022/4/20 14:14* @Params:* @Return*/public static void close() {if (in != null) {try {in.close();} catch (IOException e) {e.printStackTrace();}}if (writer != null) {try {writer.close();} catch (IOException e) {e.printStackTrace();}}}
}

数据如下:

时间维度表数据制作(调用API接口)相关推荐

  1. Python零基础速成班-第12讲-Python获取网络数据Socket,API接口,网络爬虫Crawler(制作弹幕词云)

    Python零基础速成班-第12讲-Python获取网络数据Socket,API接口,网络爬虫Crawler(制作弹幕词云) 学习目标 获取网络数据Socket API接口 网络爬虫Crawler(制 ...

  2. BI神器Power Query(14)-- PQ制作时间维度表(3)

    在上一篇博客中,根据日期序列新建了文本日期列,如下图所示. 接下来将在时间维度表新建整数型的日期列,使用上一篇博客中添加自定义列的方法可以实现这个要求,本文将使用不同的操作方法来实现. 选中" ...

  3. BI神器Power Query(18)-- PQ制作时间维度表(7)

    在上一篇博客中,通过Date.ToText和Date.DayOfWeekName函数创建了新的数据列,如下图所示. 有时需要使用年月和年月日等日期格式,有两种实现方法. 利用前面已经提取的年.月.日, ...

  4. BI神器Power Query(17)-- PQ制作时间维度表(6)

    在上一篇博客中,通过Text.From函数创建了"年份"."季度"和"月份"列数据列,如下图所示. 大家都知道在Excel中日期格式有很多种 ...

  5. BI神器Power Query(13)-- PQ制作时间维度表(2)

    在上一篇博客中,创建了日期序列,如下图所示. 接下来我们继续创建时间维度表的其他列,依次单击[添加列]选项卡=>[日期]下拉按钮=>[仅日期],将添加新列,可以从指定数据列(例如包含日期和 ...

  6. 如何调用api接口获取其中的数据

    part1.API接口可以运用到的场景,主要包括以下几个方面: 1. 应用程序集成:API可以使不同的应用程序相互之间进行集成,比如将某个应用程序的数据传递给另一个应用程序,或者调用另一个应用程序的功 ...

  7. 如何利用python调用API接口获取数据进行测试

    一.Python 可以使用 requests 库来调用 API 接口获取数据.以下是基本的步骤: 1.安装 requests 库 pip install requests 2.导入 requests ...

  8. 调用API接口 获取和解析 京东按关键字搜索商品数据

    这篇文章主要介绍了如何调用API接口 获取和解析京东按关键字搜索商品数据,帮助大家更好的理解和使用API接口. 点击测试 请求示例 <?php// 请求示例 url 默认请求参数已经URL编码处 ...

  9. BI神器Power Query(15)-- PQ制作时间维度表(4)

    在上一篇博客中,使用[重复列]添加新列,如下图所示. 接下来讲解一下[添加列]选项卡中[日期]按钮的使用方法. 如果选中的列不是日期类型,那么多数功能将被禁用,如下图所示. 选中[Date]列,依次单 ...

最新文章

  1. 应用Java程序片段动态生成表格
  2. springMVC教程--拦截器详解
  3. MFC模块的动态链接库DLL以及静态链接库LIB编译后的调用
  4. 3-2 文件夹类Directory的常用方法(2)
  5. 从底部上滑失灵_宝鸡终于也有超火的高空玻璃水滑啦!就在玉池公社!8月10日见~...
  6. Win7系统关闭兼容性选项的方法
  7. java户名的正则表达式_java – 用于验证用户名的正则表达式
  8. iview关闭抽屉弹层时清空Select弹框高亮样式
  9. extjs修改页面的内容关键问题
  10. 虚拟化识别共享USB加密狗|银行U盾等解决方案
  11. stata学习笔记|自相关处理问题
  12. C#搞工控的一些代码
  13. MySQL登录时出现的Access denied for user 'root'@'xxx.xxx.xxx.xxx' (using password: YES) 的解决办法
  14. 【线性代数笔记】正定矩阵及其性质
  15. coreldraw x5 选择工具快捷键_CorelDRAW X5实用教程:X5版本常用快捷键
  16. 【优化算法】多目标灰狼优化算法(MOGWO)【含Matlab源码 099期】
  17. 【Java获取国家法定节假日三种工具类其三】
  18. 班主任有趣高效的班级惩罚制度
  19. oracle ogg重启mgr,OGG的常见运维任务指南
  20. Spring Security应用详解(集成SpringBoot)

热门文章

  1. 递归算法O(∩_∩)O哈哈~
  2. DVWA爆破high等级与token机制介绍(附防爆破措施)
  3. 解决Http或Https中下载中文文件乱码和无法下载问题
  4. Android平台游戏开发引擎使用指引
  5. Float.compare()和Double.compare()的使用
  6. QQ的端口被封,怎样才能突破这道防线
  7. hadoop生态圈----zookeeper
  8. 探究Shodan之旅之Shodan Hacking
  9. javascript复习之旅 11.1 class基础使用
  10. 安装部署vCenter 6.7