如何创建2016-01-01至昨日的日期-小时维度表?
嘿,这个需求我之前帮人处理过类似的,得看你平时用什么工具干活,不同场景下最优方法不一样,我给你唠几个最实用的方案:
方案一:数据库场景(SQL)—— 直接在库内生成
如果是要在数据库(比如MySQL 8.0+、PostgreSQL)里生成这张表,那用递归CTE或者内置的序列生成函数绝对是最优解,不用额外工具,性能还靠谱,尤其是日期范围大的时候。
MySQL版本
WITH RECURSIVE date_range AS ( SELECT '2016-01-01' AS date_val UNION ALL SELECT DATE_ADD(date_val, INTERVAL 1 DAY) FROM date_range WHERE date_val < CURDATE() - INTERVAL 1 DAY -- 取昨日日期 ), hours AS ( SELECT 0 AS hour_val UNION ALL SELECT hour_val + 1 FROM hours WHERE hour_val < 23 ) SELECT DATE_FORMAT(date_val, '%d-%m-%Y') AS Date, -- 转成你要的dd-mm-yyyy格式 hour_val AS Hour FROM date_range CROSS JOIN hours ORDER BY Date, Hour;
PostgreSQL版本
PostgreSQL的日期序列生成更简洁,一行就搞定日期范围:
SELECT TO_CHAR(d.date_val, 'DD-MM-YYYY') AS Date, h.hour_val AS Hour FROM generate_series('2016-01-01'::date, CURRENT_DATE - 1, '1 day') AS d(date_val), generate_series(0, 23) AS h(hour_val) ORDER BY Date, Hour;
方案二:数据分析/导出场景(Python Pandas)
要是你需要生成后做数据分析,或者导出成CSV/Excel文件,那用Python的Pandas库是最省心的,几行代码就搞定所有细节:
import pandas as pd from datetime import datetime, timedelta # 定义起始日期和结束日期(昨日) start_date = datetime(2016, 1, 1) end_date = datetime.now() - timedelta(days=1) # 直接生成每小时的时间序列 date_hour_seq = pd.date_range(start=start_date, end=end_date, freq='H') # 转换成你要的两列表格 result_df = pd.DataFrame({ 'Date': date_hour_seq.strftime('%d-%m-%Y'), 'Hour': date_hour_seq.hour }) # 要是需要导出的话,直接运行下面这行 # result_df.to_csv('date_hour_table.csv', index=False)
这个方法的优势是灵活,生成的DataFrame可以直接用来做统计、可视化,完全不用手动处理日期和小时的对应关系。
方案三:办公场景(Excel)—— 无代码实现
要是你不想碰代码,纯用办公软件搞定,Excel的Power Query功能就能轻松实现,步骤也不复杂:
- 生成日期列:在A1单元格输入
2016-01-01,然后按住单元格右下角的填充柄下拉,直到出现昨日的日期。 - 生成小时列:在B1到Y1单元格分别输入
0到23,对应每个小时。 - 逆透视生成目标表:
- 选中A1到Y列最后一行的区域,点击「数据」选项卡 ->「从表格/区域」,进入Power Query编辑器。
- 选中B到Y列的所有小时列,点击「转换」选项卡 ->「逆透视列」。
- 删除自动生成的「属性」和「值」列里多余的内容,把「属性」列重命名为
Hour,最后把日期列格式改成dd-mm-yyyy就搞定了。
内容的提问来源于stack exchange,提问作者Jess8766
相关产品推荐
相关产品推荐

