日期维度表

1 python date+中国节假日

1.1 date

# 字段	
# date	日期
# month	月份
# year	年
# year_month	年月
# quarter	季度
# week	一年第几周
# weekday	一周第几天
# dt_of_month	一个月第几天
# dt_of_year	一年第几天
# is_last_day_of_month	是否一个月最后一天
# is_workday	是否工作日
# update_date	数据更新日期


import datetime

start_date = datetime.datetime(2018,1,1)
end_date = datetime.datetime(2031,1,1)
# start_date = datetime.datetime(2019,1,1)
# end_date = datetime.datetime(2019,2,1)
day = start_date

while(day < end_date):
    dt = day.strftime("%Y-%m-%d")
    month=str(day.month)
    year=str(day.year)
    year_month=day.strftime("%Y-%m")
    quarter=''
    if month in('1','2','3'):
        quarter='1'
    elif month in ('4','5','6'):
        quarter='2'
    elif month in ('7','8','9'):
        quarter='3'
    elif month in ('10','11','12'):
        quarter='4'
    week=str(day.isocalendar()[1])
    weekday=str(day.isocalendar()[2])
    dt_of_month=str(day.day)
    dt_of_year=str(day.timetuple().tm_yday)
    is_workday=str(day.isoweekday())


    # print(quarter)

    print('('+str(dt)+','+month+','+year+','+year_month+','+quarter+','+week+','
    +weekday+','+dt_of_month+','+dt_of_year+','+is_workday+'),')

    # lunar_dt = get_lunar_dt(dt)
    # quarter_of_year = quarter(day.month)
    # week_of_year = get_week_of_year(day)
    # dt_of_week = get_day_of_week(day)
    # dt_of_month = day.day
    # dt_of_year = get_day_of_year(day)
    # is_last_day_of_month = last_day_of_month(calendar_year,month_of_year,dt_of_month)
    # is_weekend = get_is_weekend(day)
    # is_holiday = get_is_holiday(day)
    # holiday_type = get_holiday_type(day,is_weekend)
    # holiday_cnt = get_holiday_cnt(day)
    # data_raw = [dt,lunar_dt,calendar_year,quarter_of_year,month_of_year,week_of_year,dt_of_week,dt_of_month,dt_of_year,is_last_day_of_month,is_weekend,is_holiday,holiday_type,holiday_cnt]
    # print data_raw
    # write_csv(data_raw)
    # # print '日期:'+dt+ '年份'+str(calendar_year)+'Q'+str(quarter_of_year)+'月份'+str(month_of_year)+'周'+str(week_of_year)+'星期'+str(dt_of_week)+' 月的第'+str(dt_of_month)+' 年的第'+str(dt_of_year)+str(is_weekend)

    day = day + datetime.timedelta(days=1)



1.2 holiday

import datetime
import chinese_calendar


start_time=datetime.date(2019,1,1)
end_time=datetime.date(2024,12,31)

holiday=chinese_calendar.get_holidays(start_time,end_time)

for i in holiday:
    on_holiday, holiday_name=chinese_calendar.get_holiday_detail(i)
    w=i.isoweekday()
    if holiday_name==None:
        if w == 6:
            holiday_name='周六'
        elif w==7:
            holiday_name='周天'
    elif holiday_name=="New Year's Day":
        holiday_name='元旦'
    elif holiday_name=="Spring Festival":
        holiday_name='春节'
    elif holiday_name=="Tomb-sweeping Day":
        holiday_name='清明节'
    elif holiday_name=="Labour Day":
        holiday_name='劳动节'
    elif holiday_name=="Dragon Boat Festival":
        holiday_name='端午节'
    elif holiday_name=="National Day":
        holiday_name='国庆节'
    elif holiday_name=="Mid-autumn Festival":
        holiday_name='中秋节'  
    print("('"+str(i.year)+'-'+str(i.month)+'-'+str(i.day)+"','"+str(holiday_name)+"',"+str(w)+'),')
('2019-1-1','元旦',2),

1.3 workday

import datetime
import chinese_calendar


start_time=datetime.date(2019,1,1)
end_time=datetime.date(2024,12,31)

workday=chinese_calendar.get_workdays(start_time,end_time)

for i in workday:
    w=i.isoweekday()
    print('('+str(i.year)+'-'+str(i.month)+'-'+str(i.day)+",工作日,"+str(w)+','+
          str(i.year)+','+str(i.month)+','+str(i.day)+','++','++','++'),')


(2019-1-2,工作日,3),

2 处理

-- 节假日表
CREATE TABLE atlasdb.dim_holidays (
	holiday varchar(10) NULL,
	"name" varchar(50) NULL,
	wage int4 NULL,
	"date" varchar(50) NULL,
	"after" varchar(10) NULL,
	"target" varchar(50) NULL
);

-- 日期维度表
CREATE TABLE fddw.dim_date (
	"date" oradate NULL,
	"year" float8 NULL,
	"month" float8 NULL,
	month_name text NULL,
	"day" float8 NULL,
	day_of_year float8 NULL,
	weekday_name text NULL,
	calendar_week float8 NULL,
	char_date text NULL,
	quarter text NULL,
	year_quarter text NULL,
	year_month text NULL,
	year_calendar_week text NULL,
	weekend text NULL,
	american_holiday text NULL,
	austrian_holiday text NULL,
	canadian_holiday text NULL,
	chinese_holiday text NULL,
	remark varchar(50) NULL,
	wage int4 NULL,
	is_workday text NULL,
	cw_start oradate NULL,
	cw_end oradate NULL,
	month_start oradate NULL,
	month_end oradate NULL

)
WITH (
	orientation=row,
	compression=no,
	fillfactor=80
);

COMMENT ON COLUMN dim_date.date is '日期';
COMMENT ON COLUMN dim_date.year is '月';
COMMENT ON COLUMN dim_date.month is '年';
COMMENT ON COLUMN dim_date.month_name is '月';
COMMENT ON COLUMN dim_date.day is '日';
COMMENT ON COLUMN dim_date.day_of_year is '年日';
COMMENT ON COLUMN dim_date.weekday_name is '星期一~星期日';
COMMENT ON COLUMN dim_date.calendar_week is '日期周几';
COMMENT ON COLUMN dim_date.char_date is '文本型日期';
COMMENT ON COLUMN dim_date.quarter is '季度';
COMMENT ON COLUMN dim_date.year_quarter is '年季度';
COMMENT ON COLUMN dim_date.year_month is '年月';
COMMENT ON COLUMN dim_date.year_calendar_week is '年周数';
COMMENT ON COLUMN dim_date.weekend is '工作日还是周末';
COMMENT ON COLUMN dim_date.american_holiday is '美国节日';
COMMENT ON COLUMN dim_date.austrian_holiday is '澳大利亚节日';
COMMENT ON COLUMN dim_date.canadian_holiday is '加拿大节日';
COMMENT ON COLUMN dim_date.chinese_holiday is '中国节日';
COMMENT ON COLUMN dim_date.remark is '中国节日备注';
COMMENT ON COLUMN dim_date.wage is '薪资倍数';
COMMENT ON COLUMN dim_date.is_workday is '是否工作日';
COMMENT ON COLUMN dim_date.cw_start is '当周开始日期';
COMMENT ON COLUMN dim_date.cw_end is '当周结束日期';
COMMENT ON COLUMN dim_date.month_start is '月开始日期';
COMMENT ON COLUMN dim_date.month_end is '月结束日期';



INSERT INTO FDDW.dim_date (
	SELECT
		datum as date,
		extract(year from datum) AS year,
		extract(month from datum) AS month,
		-- Localized month name
		-- to_char(datum, 'TMMonth') AS month_name,
		to_char(datum, 'mm"月"') AS month_name,
		extract(day from datum) AS day,
		extract(doy from datum) AS day_of_year,
		-- Localized weekday
		to_char(datum, 'TMDay') AS weekday_name,
		-- ISO calendar week
		extract(week from datum) AS calendar_week,
		to_char(datum, 'yyyy-mm-dd') AS char_date,
		'Q' || to_char(datum, 'Q') AS quarter,
		to_char(datum, 'yyyy"年Q"Q') AS year_quarter,
		to_char(datum, 'yyyy"年"mm"月"') AS year_month,
		-- to_char(datum, 'yyyy/"Q"Q') AS year_quarter,
		-- to_char(datum, 'yyyy/mm') AS year_month,
		-- ISO calendar year and week
		to_char(datum, 'iyyy/IW') AS year_calendar_week,
		-- Weekend
		CASE WHEN extract(isodow from datum) in (6, 7) THEN '周末' ELSE '工作日' END AS weekend,
		-- Fixed holidays 
			-- for America
			CASE WHEN to_char(datum, 'MMDD') IN ('0101', '0704', '1225', '1226')
			THEN '是' ELSE '否' END
			AS american_holiday,
			-- for Austria
		CASE WHEN to_char(datum, 'MMDD') IN 
			('0101', '0106', '0501', '0815', '1101', '1208', '1225', '1226') 
			THEN '是' ELSE '否' END 
			AS austrian_holiday,
			-- for Canada
			CASE WHEN to_char(datum, 'MMDD') IN ('0101', '0701', '1225', '1226')
			THEN '是' ELSE '否' END 
			AS canadian_holiday,
			
		CASE WHEN d.holiday = 1 THEN '是' ELSE '否' END  AS chinese_holiday,
		d.name AS remark,
		
		d.wage,
		CASE 
			WHEN d.holiday = 1 THEN '否' 
			WHEN d.holiday = 0 THEN '是'
			WHEN d.holiday IS NULL AND extract(isodow from datum) in (6, 7) THEN '否'
			ELSE '是' END AS is_workday,
		
		-- Some periods of the year, adjust for your organisation and country
	--	CASE WHEN to_char(datum, 'MMDD') BETWEEN '0701' AND '0831' THEN 'Summer break'
	--	     WHEN to_char(datum, 'MMDD') BETWEEN '1115' AND '1225' THEN 'Christmas season'
	--	     WHEN to_char(datum, 'MMDD') > '1225' OR to_char(datum, 'MMDD') <= '0106' THEN 'Winter break'
	--		ELSE 'Normal' END
	--		AS period,
		-- ISO start and end of the week of this date
		datum + (1 - extract(isodow from datum))::integer AS cw_start,
		datum + (7 - extract(isodow from datum))::integer AS cw_end,
		-- Start and end of the month of this date
		datum + (1 - extract(day from datum))::integer AS month_start,
		(datum + (1 - extract(day from datum))::integer + '1 month'::interval)::date - '1 day'::interval AS month_end
	FROM (
		-- There are 3 leap years in this range, so calculate 365 * 10 + 3 records
		SELECT '2000-01-01'::DATE + sequence.day AS datum
		FROM generate_series(0,36520) AS sequence(day)
		GROUP BY sequence.day
		
	) DQ
	LEFT JOIN fddw.dim_holidays d ON to_char(DQ.datum, 'yyyy-mm-dd') = d.date
	ORDER BY 1 ASC  
)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值