缺失值处理 - 获取一段时间内所有日期的列表 - (Python、MySQL)

版权声明:转载请联系作者,获得允许后,添加链接及作者到页首 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 一样。

猜你喜欢

转载自blog.csdn.net/weixin_40683253/article/details/86646617