有的时候做数据清洗的时候 , 如果表中数据在某一天没有记录,但是业务要求不能有缺失日期,那么就需要我们将这些缺失日期补上。这个前提就是我们先要有一张包含所有日期的列表(作为左表),供我们进行匹配(left join)进而补上缺失日期。
Python代码:
import datetimedef 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)
BEGINSET @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 DOINSERT 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 一样。