版权声明:转载请联系作者,获得允许后,添加链接及作者到页首 https://blog.csdn.net/weixin_40683253/article/details/86646617
有的时候做数据清洗的时候 , 如果表中数据在某一天没有记录,但是业务要求不能有缺失日期,那么就需要我们将这些缺失日期补上。这个前提就是我们先要有一张包含所有日期的列表(作为左表),供我们进行匹配(left join)进而补上缺失日期。
Python代码:
import datetime
def Date_interval_list(date_start = None,date_end = None):
if date_start is None:
date_start = '2000-01-01'
if date_end is None:
date_end = datetime.datetime.now().strftime('%Y-%m-%d')
date_start=datetime.datetime.strptime(date_start,'%Y-%m-%d')
date_end=datetime.datetime.strptime(date_end,'%Y-%m-%d')
date_list = []
date_list.append(date_start.strftime('%Y-%m-%d'))
while date_start < date_end:
date_start+=datetime.timedelta(days=+1)# 日期加一天
date_list.append(date_start.strftime('%Y-%m-%d'))# 日期存入列表
print(date_list)
if __name__ == '__main__':
Date_interval_list("2018-12-25", "2019-01-07")
运行结果:
['2018-12-25', '2018-12-26', '2018-12-27', '2018-12-28',
'2018-12-29', '2018-12-30', '2018-12-31', '2019-01-01',
'2019-01-02', '2019-01-03', '2019-01-04', '2019-01-05',
'2019-01-06', '2019-01-07']
MySQL代码:
DELIMITER $$
DROP PROCEDURE IF EXISTS create_calendar $$
CREATE PROCEDURE create_calendar (s_date DATE, e_date DATE)
BEGIN
SET @createSql = 'CREATE TABLE IF NOT EXISTS calendar (
`date` date NOT NULL,
UNIQUE KEY `unique_date` (`date`) USING BTREE
)ENGINE=InnoDB DEFAULT CHARSET=utf8';
prepare stmt from @createSql;
execute stmt;
WHILE s_date <= e_date DO
INSERT IGNORE INTO calendar VALUES (DATE(s_date)) ;
SET s_date = s_date + INTERVAL 1 DAY ;
END WHILE ;
END$$
DELIMITER ;
CALL create_calendar ('2018-12-25', '2019-01-07');
运行结果:
MySQL的运行结果是直接生成一张表calendar,表中包含日期间隔里的所有日期date。
以前总觉得MySQL的作用很小,大概就是存储数据 + 简单清洗 + 数据统计 ,以后要刮目相看了,就像刮目相看 Excel 一样。