SQL 与 Python:日期维度表创建的不同选择
文章目录
- 一、日期维度表概述
- 日期维度表结构
- 二、使用 SQL 创建日期维度表
- 2.1 表结构设计
- 2.2 数据插入
- 2.3 SQL 创建方式的优势与局限
- 三、使用 Python 创建日期维度表
- 3.1 依赖库引入
- 3.2 代码实现
- 3.3 Python 创建方式的优势与局限
- 四、应用场景与选择建议
- 4.1 应用场景
- 4.2 选择建议
- 五、总结
在数据仓库和数据分析领域,日期维度表如同精准的时间标尺,为数据赋予时间维度的深度解析能力。无论是分析销售数据的周期性波动,还是研究用户行为的时间规律,日期维度表都扮演着至关重要的角色。本文将深入探讨如何使用 SQL 和 Python 两种工具创建日期维度表,分析它们各自的优势与适用场景,助力数据从业者根据实际需求灵活选择合适的方法。
一、日期维度表概述
日期维度表是数据仓库中专门用于存储日期相关信息的维度表,它包含了丰富的日期属性,如年、季度、月、日、星期几、是否为周末等。通过将这些日期信息集中存储在一个表中,不仅可以避免在事实表中重复存储,减少数据冗余,还能为数据分析提供统一、规范的时间维度。在实际应用,日期维度表常用于数据的筛选、聚合、关联分析,帮助企业从时间角度洞察业务数据,做出科学决策。
日期维度表结构
列名 | 数据类型 | 列描述 |
---|---|---|
date_key | INT | 主键,采用YYYYMMDD 格式的整数,唯一标识每个日期 |
full_date | DATE | 完整日期 |
year | INT | 年份 |
quarter | INT | 季度,1 - 4 分别代表第一至第四季度 |
month | INT | 月份,1 - 12 分别代表 1 月至 12 月 |
month_name | VARCHAR(10) | 月份的英文全称,如 January、February 等 |
day_of_month | INT | 每月的第几天,范围是 1 - 31 |
day_of_week | INT | 星期几,0 - 6 分别代表星期日至星期六 |
day_name | VARCHAR(10) | 星期的英文全称,如 Sunday、Monday 等 |
is_weekend | BOOLEAN | 是否为周末,TRUE 表示周末,FALSE 表示工作日 |
week_of_year | INT | 一年中的第几周 |
fiscal_year | INT | 财政年度,每个财年从 4 月份开始,如 2024 年 4 月到 2025 年 3 月是 2024 财年 |
fiscal_quarter | INT | 财政季度,4、5、6 月为第一财季,7、8、9 月为第二财季,10、11、12 月为第三财季,1、2、3 月为第四财季 |
day_of_year | INT | 一年中的第几天,范围是 1 - 365 或 1 - 366(闰年) |
is_leap_year | BOOLEAN | 是否为闰年,TRUE 表示闰年,FALSE 表示平年 |
date_iso | VARCHAR(10) | ISO 标准日期格式,如2020 - 01 - 01 |
date_us | VARCHAR(10) | 美国常用日期格式,如01/01/2020 |
date_eu | VARCHAR(10) | 欧洲常用日期格式,如01/01/2020 |
二、使用 SQL 创建日期维度表
2.1 表结构设计
以 PostgreSQL 为例,创建调整后表结构的日期维度表的 SQL 语句如下:
-- 创建日期维度表
CREATE TABLE date_dimension (date_key INT PRIMARY KEY,full_date DATE NOT NULL,year INT NOT NULL,quarter INT NOT NULL,month INT NOT NULL,month_name VARCHAR(10) NOT NULL,day_of_month INT NOT NULL,day_of_week INT NOT NULL,day_name VARCHAR(10) NOT NULL,is_weekend BOOLEAN NOT NULL,week_of_year INT NOT NULL,fiscal_year INT,fiscal_quarter INT,day_of_year INT NOT NULL,is_leap_year BOOLEAN NOT NULL,date_iso VARCHAR(10),date_us VARCHAR(10),date_eu VARCHAR(10)
);
在上述代码中,定义的date_dimension
表涵盖了丰富的日期属性列,能够满足多样化的数据分析需求。主键date_key
采用特定格式的整数唯一标识每个日期;full_date
存储完整日期信息;其余各列分别用于存储不同维度的日期相关属性。
2.2 数据插入
接下来,使用DO
语句块和WHILE
循环向表中插入数据,假设数据范围为 2025 - 01 - 01 至 2028 - 12 - 31,同时修改财年和财季的计算逻辑:
-- 插入数据示例(这里假设从 2025-01-01 到 2028-12-31)
DO $$
DECLAREstart_date DATE := '2025-01-01';end_date DATE := '2028-12-31';current_date DATE := start_date;
BEGINWHILE current_date <= end_date LOOPINSERT INTO date_dimension (date_key,full_date,year,quarter,month,month_name,day_of_month,day_of_week,day_name,is_weekend,week_of_year,fiscal_year,fiscal_quarter,day_of_year,is_leap_year,date_iso,date_us,date_eu)VALUES (TO_CHAR(current_date, 'YYYYMMDD')::INT,current_date,EXTRACT(YEAR FROM current_date),EXTRACT(QUARTER FROM current_date),EXTRACT(MONTH FROM current_date),TO_CHAR(current_date, 'Month'),EXTRACT(DAY FROM current_date),EXTRACT(DOW FROM current_date),TO_CHAR(current_date, 'Day'),CASE WHEN EXTRACT(DOW FROM current_date) IN (0, 6) THEN TRUE ELSE FALSE END,EXTRACT(WEEK FROM current_date),-- 计算财年CASE WHEN EXTRACT(MONTH FROM current_date) >= 4 THEN EXTRACT(YEAR FROM current_date) ELSE EXTRACT(YEAR FROM current_date) - 1 END,-- 计算财季CASE WHEN EXTRACT(MONTH FROM current_date) IN (4, 5, 6) THEN 1WHEN EXTRACT(MONTH FROM current_date) IN (7, 8, 9) THEN 2WHEN EXTRACT(MONTH FROM current_date) IN (10, 11, 12) THEN 3ELSE 4END,EXTRACT(DOY FROM current_date),CASE WHEN (EXTRACT(YEAR FROM current_date) % 4 = 0 AND (EXTRACT(YEAR FROM current_date) % 100 != 0 OR EXTRACT(YEAR FROM current_date) % 400 = 0)) THEN TRUE ELSE FALSE END,TO_CHAR(current_date, 'YYYY-MM-DD'),TO_CHAR(current_date, 'MM/DD/YYYY'),TO_CHAR(current_date, 'DD/MM/YYYY'));current_date := current_date + INTERVAL '1 day';END LOOP;
END $$;
这段代码通过循环遍历指定日期范围,利用EXTRACT
函数提取日期各部分信息,TO_CHAR
函数转换日期格式,CASE WHEN
语句实现是否为周末、闰年、财年和财季的判断,最终将计算得到的完整日期属性插入到date_dimension
表中。
2.3 SQL 创建方式的优势与局限
优势方面,SQL 直接在数据库中操作,能够充分利用数据库的存储和查询优化机制,适合处理大规模数据,数据插入和查询效率高。同时,与数据库紧密集成,便于在数据库环境中进行数据管理和维护。然而,SQL 的语法相对固定,对于复杂的日期计算和数据处理逻辑,编写代码的难度较大,且代码的复用性和扩展性相对较差。如果需要对日期维度表进行结构调整或添加新的属性,可能需要修改表结构和插入语句,操作较为繁琐。
三、使用 Python 创建日期维度表
3.1 依赖库引入
Python 中使用pandas
库创建日期维度表,首先需要导入该库:
import pandas as pd
3.2 代码实现
import pandas as pddef create_time_dimension(start_date, end_date):# 生成日期范围dates = pd.date_range(start=start_date, end=end_date)df = pd.DataFrame({'full_date': dates})# 日期相关列df['date_key'] = df['full_date'].dt.strftime('%Y%m%d').astype(int)df['year'] = df['full_date'].dt.yeardf['quarter'] = df['full_date'].dt.quarterdf['month'] = df['full_date'].dt.monthdf['month_name'] = df['full_date'].dt.month_name()df['day_of_month'] = df['full_date'].dt.daydf['day_of_week'] = df['full_date'].dt.dayofweekdf['day_name'] = df['full_date'].dt.day_name()df['is_weekend'] = df['day_of_week'].isin([5, 6])df['week_of_year'] = df['full_date'].dt.isocalendar().week# 计算财年和财季df['fiscal_year'] = df['full_date'].dt.year.where(df['full_date'].dt.month >= 4, df['full_date'].dt.year - 1)df['fiscal_quarter'] = pd.cut(df['full_date'].dt.month, bins=[3, 6, 9, 12, 15], labels=[1, 2, 3, 4])df['day_of_year'] = df['full_date'].dt.dayofyeardf['is_leap_year'] = df['full_date'].dt.is_leap_year# 日期格式列df['date_iso'] = df['full_date'].dt.strftime('%Y-%m-%d')df['date_us'] = df['full_date'].dt.strftime('%m/%d/%Y')df['date_eu'] = df['full_date'].dt.strftime('%d/%m/%Y')return df# 示例使用
start_date = '2025-01-01'
end_date = '2028-12-31'
time_dimension = create_time_dimension(start_date, end_date)
print(time_dimension.head())
上述代码定义的create_time_dimension
函数,通过pd.date_range
生成指定日期范围内的日期序列构建初始 DataFrame。随后,利用pandas
强大的时间序列处理功能添加各类日期相关属性列,使用where
方法和pd.cut
函数修改财年和财季的计算逻辑 ,最终返回完整的日期维度表数据。
3.3 Python 创建方式的优势与局限
Python 的优势在于其丰富的库资源和灵活的编程方式,代码的可读性和可维护性较高。通过pandas
等库可以轻松实现复杂的日期计算和数据处理逻辑,并且代码的复用性强,便于扩展和修改。例如,若要添加新的日期属性,只需在函数中增加相应的计算逻辑即可。但 Python 创建日期维度表需要将数据加载到内存中处理,在处理大规模数据时可能会面临内存不足的问题,而且需要依赖 Python 运行环境和相关库的安装与配置,部署过程相对复杂。
四、应用场景与选择建议
4.1 应用场景
当企业已经拥有成熟的数据库环境,且需要创建大规模的日期维度表,并直接在数据库中进行后续的查询和分析操作时,SQL 是更好的选择。例如,数据仓库中定期生成的月度、季度报表,利用 SQL 创建的日期维度表能够高效地与事实表进行关联查询。而对于数据探索性分析、数据预处理阶段,或者需要与其他 Python 数据处理流程集成时,Python 则更为适用。比如,在机器学习项目中,使用 Python 创建日期维度表并进行特征工程,能够无缝衔接后续的模型训练环节。
4.2 选择建议
如果对数据处理的实时性要求较高,且数据规模较大,建议优先使用 SQL。若更注重代码的灵活性、可读性以及与其他 Python 工具的集成,或者处理的数据量相对较小,Python 则是不错的选择。在实际项目中,也可以结合使用两种方式,发挥各自的优势,如先用 SQL 在数据库中创建基础的日期维度表,再使用 Python 对表中的数据进行进一步的清洗、转换和分析。
五、总结
SQL 和 Python 作为创建日期维度表的两种重要工具,各有优劣。SQL 凭借其与数据库的紧密结合和高效的数据处理能力,在大规模数据存储和查询场景中表现出色;Python 则以灵活的编程方式和丰富的库资源,为数据处理和分析提供了强大的支持。了解它们的特点和适用场景,能够帮助数据从业者在实际工作中做出更明智的选择,从而更高效地构建日期维度表,为数据分析和决策提供坚实的基础。
相关文章:
SQL 与 Python:日期维度表创建的不同选择
文章目录 一、日期维度表概述日期维度表结构 二、使用 SQL 创建日期维度表2.1 表结构设计2.2 数据插入2.3 SQL 创建方式的优势与局限 三、使用 Python 创建日期维度表3.1 依赖库引入3.2 代码实现3.3 Python 创建方式的优势与局限 四、应用场景与选择建议4.1 应用场景4.2 选择建…...

Transformer-LSTM混合模型在时序回归中的完整流程研究
Transformer-LSTM混合模型在时序回归中的完整流程研究 引言与背景 深度学习中的长期依赖建模一直是时序预测的核心问题。长短期记忆网络(LSTM)作为一种循环神经网络,因其特殊的门控结构能够有效捕捉序列的历史信息,并在时序预测…...

UE5 渲染思路笔记(角色)
参考示例 首先是怎么做到辉光只有部分有而整体没有的 使用的是Bloom内的阈值,控制光的溢光量 Threshold(阈值):这个参数决定了图像中哪些像素会参与泛光计算。只有那些亮度超过阈值的像素才会触发泛光效果。阈值越低,更多的像素会…...

运维打铁:服务器分类及PHP入门
文章目录 C/S架构和B/S架构C/S架构B/S架构 服务器分类服务器类型服务器软件 使用 WampServer 搭建 HTTP服务集成环境的分类WampServer 的安装测试访问配置网站根目录 静态网站和动态网站PHP的常见语法第一段 php 代码注释变量数据类型运算符函数的定义类和对象内容输出循环语句…...
js原型污染 + xss劫持base -- no-code b01lersctf 2025
题目信息:Found this new web framework the other day—you don’t need to write any code, just JSON. 我们先来搞清楚究竟发生了什么 当我们访问 /index /*** 处理 /:page 路径的 GET 请求* param {Object} req - 请求对象* param {Object} reply - 响应对象* returns {Pro…...
力扣92.反转指定范围内的链表、25.k个一组反转链表
92.反转指定范围内的链表 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next;…...

Python - 爬虫;Scrapy框架(一)
框架,就相当于一个封装了很多功能的结构体,它帮我们把主要的结构给搭建好了,我们只需往骨架里添加内容就行。 Scrapy是适用于Python的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scra…...

The 2024 ICPC Kunming Invitational Contest G. Be Positive
https://codeforces.com/gym/105386/problem/G 题目: 结论: 从0开始每四个相邻数的异或值为0 代码: #include<bits/stdc.h> using namespace std; #define int long long void solve() {int n;cin >> n;if(n1||n%40){cout &…...

GET请求如何传复杂数组参数
背景 有个历史项目,是GET请求,但是很多请求还是复杂参数,比如:参数是数组,且数组中每一个元素都是复杂的对象,这个时候怎么传参数呢? 看之前请求直接是拼接在url后面 类似&items%5B0%5D.…...

leetcode - 双指针问题
文章目录 前言 题1 移动零: 思路: 参考代码: 题2 复写零: 思考: 参考代码: 题3 快乐数: 思考: 参考代码: 题4 盛最多水的容器: 思考:…...

人工智能之数学基础:二次型
本文重点 二次型作为线性代数领域的重要概念,架起了代数方程与几何分析之间的桥梁。从古典解析几何中的圆锥曲线方程到现代优化理论中的目标函数,二次型以其简洁的数学表达和丰富的结构特性,在数学物理、工程技术和经济金融等领域发挥着不可替代的作用。 二次型的基本概念…...
存储过程补充——流程控制语句详解
文章目录 1. 条件判断语句1.1 分支结构之 IF1.2 分支结构之 CASE 2. 循环语句2.1 循环结构之LOOP2.2 循环结构之WHILE2.3 循环结构之REPEAT 3. 跳转语句3.6 跳转语句之LEAVE语句3.7 跳转语句之ITERATE语句 在数据库管理系统中,存储过程是一种强大的工具,…...

【Unity笔记】实现支持不同渲染管线的天空盒曝光度控制组件(SkyboxExposureController)——参数化控制
写在前面 在Unity中,天空盒(Skybox)不仅承担视觉上的背景作用,更是场景环境光照与氛围塑造的重要组成部分。不同时间、天气、场景转换等,都需要灵活调整天空的亮度。而**曝光度(Exposure)**就是…...

Docker 使用与部署(超详细)
目录 引入 入门使用 部署对比 镜像仓库 命令解释 基础 常见命令 示例 数据卷的使用 数据卷的概念 数据卷的使用 挂载本地目录文件 镜像 结构 Dockerfile 容器网络 部署 DockerCompose 语法 编辑 基础命令 引入 当我们在 Linux 上部署一个集成了很多中间件…...

CSS实现图片垂直居中方法
html <div class"footer border-top-row"><div class"footer-row"><span class"footer-row-col01">制单人:{{ printData[pageIndex - 1].rkMaster.makerName}}<img :src"getPersonSignImgSrc(printData[pa…...
C#实现Socket通信:基于TCP/IP协议的网络编程
TCP/IP网络模型 最上层的是应用层,也就是我们日常可以接触到的,它会给数据添加对应的头部,并传输给传输层,应用层是我们日常会接触到的,比如HTTP,FTP,Telnet,DNS,SMTP。…...
基于C++的IOT网关和平台7:github项目ctGateway设备协议开发指南
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。 源码指引:github源码指引_初级代码游戏的博客-CSDN博客 系…...
大数据实时数仓的数据质量监控解决方案
实时数仓不仅仅是传统数据仓库的升级版,它更强调数据的实时性、流动性和高可用性,通过对海量数据的即时处理和分析,为企业提供近乎实时的洞察力。这种能力在金融、零售、制造、互联网等行业中尤为关键,例如,电商平台可以通过实时数仓监控用户行为,动态调整推荐算法;金融…...

Python+Scrapy跨境电商爬虫实战:从亚马逊/沃尔玛数据采集到反爬攻克(附Pangolin API高效方案)
从零实战到反爬攻克,揭秘跨境数据抓取全流程与Pangolin Scrape API终极方案 在当今数据驱动的跨境电商时代,谁掌握了优质的市场数据,谁就掌握了成功的关键。随着全球电商市场规模持续扩大(据Statista最新报告显示,2025…...
简单快速的浮点数转字符串算法,适合单片机环境
目的是在OLED 屏幕上显示浮点数,有几个设计要求: 我已经有一个现成的能显示整数的函数,希望尽量复用;尽量不使用除法;不需要考虑小数四舍五入的问题; 我觉得小数四舍五入其实很多时候没什么用处ÿ…...
c++中构造对象实例的两种方式及其返回值
c中,构造对象实例有两种方式,一种返回对象实例,一种返回该对象实例的指针。如下所示: 一、两种返回值 RedisConn conn1; //得到实例conn1;RedisConn *conn2 new RedisConn();//得到指针conn2;RedisConn conn3 new RedisConn()…...
Python实例题:Python操作excel自动化开发
目录 Python实例题 题目 安装依赖库 示例代码 代码解释 写入 Excel 文件: 读取 Excel 文件: 修改 Excel 文件: 运行思路 注意事项 Python实例题 题目 Python操作excel自动化开发 安装依赖库 pip install openpyxl示例代码 imp…...

【日撸 Java 三百行】Day 7(Java的数组与矩阵元素相加)
目录 Day 7:Java 的数组与矩阵元素相加 一、基本知识 二、矩阵的建立与基本计算 三、代码及测试 拓展:Arrays类详解 小结 Day 7:Java 的数组与矩阵元素相加 Task: 矩阵的赋值.二重循环. 一、基本知识 在学习 Java 中的数组与矩…...

【Python】常用命令提示符
Python常用的命令提示符 一、Python环境基础命令【Windows】 于Windows环境下,针对Python,在CMD(命令提示符)常用的命令以及具体用法,怎么用; 主要包含:运行脚本、包管理、虚拟环境、调试与…...

vite:npm 安装 pdfjs-dist , PDF.js View 预览功能示例
pdfjs-dist 是 Mozilla 的 PDF.js 库的预构建版本,能让你在项目里展示 PDF 文件。下面为你介绍如何用 npm 安装 pdfjs-dist 并应用 pdf.js 和 pdf.worker.js。 为了方便,我将使用 vite 搭建一个原生 js 项目。 1.创建项目 npm create vitelatest pdf-v…...

【开源版】likeshop上门家政系统PHP版全开源+uniapp前端
一.系统介绍 likeshop_上门家政系统,PHP版本更新至2.1.1最新版,全开源,适用于上门家政场景,系统拥有用户端、师傅端、无论运营还是二开都是性价比极高的100%开源家政系统。 二.搭建环境-教程 系统环境:CentOS、 运行…...
html object标签介绍(用于嵌入外部资源通用标签)(已不推荐使用deprecated,建议使用img、video、audio标签)
文章目录 HTML <object> 标签详解基本语法与核心属性关键属性解析1. **data**2. **type**3. **width & height**4. **name** 嵌入不同类型的资源1. **嵌入图像**2. **嵌入音频**3. **嵌入视频**4. **嵌入 PDF** 参数传递与回退内容**参数(<param>&a…...

MySQL 8.0 OCP 英文题库解析(一)
Oracle 为庆祝 MySQL 30 周年,从 2025.04.20 ~ 2025.07.31 之间,所有人均可以免费考取 MySQL OCP 认证。从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证,省1700多RMB&…...

路由器断流排查终极指南:从Ping测试到Wireshark抓包5步定位法
测试路由器是否出现“断流”(网络连接间歇性中断),需通过多维度排查硬件、软件及外部干扰因素。以下是详细步骤指南: 一、基础环境准备 设备连接 有线测试:用网线将电脑直接连接路由器LAN口,排除WiFi干扰。…...
【Python零基础入门系列】第1篇:Python 是什么?怎么装环境?推荐哪些 IDE?
各位网友们,欢迎来到我的 Python 学习专栏! 前两天看到新闻英伟达为 CUDA 添加原生 Python 支持,意味着开发者可直接用 Python 操作 GPU,加速 AI 和高性能计算,降低门槛,让 Python 的应用范围更广、能力更强。 一直想写一系列文章教知友们从零开始学会 Python 编程,目…...