日期维度表

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  
)

<think>嗯,用户想了解Excel中的VLOOKUP函数的用法和参数含义。首先,我需要回忆一下VLOOKUP的基本结构。VLOOKUP是垂直查找函数,用于在表格的首列查找指定的值,然后返回该行中指定列的数据。它的四个参数分别是查找值、表格范围、列索引号和匹配模式。 接下来,我得确认每个参数的具体作用。第一个参数是lookup_value,也就是用户要查找的值,比如产品ID或者姓名。第二个参数是table_array,即查找的范围,这里要注意的是,查找值必须位于这个范围的第一列,否则函数无法正确工作。第三个参数是col_index_num,也就是用户想要返回的数据在表格范围中的第几列,这个列数是从表格范围的第一列开始算起的,不是整个工作表的列。第四个参数是range_lookup,决定是精确匹配还是近似匹配,通常用FALSE或0来指定精确匹配,避免错误。 然后,用户可能需要一个具体的例子来理解如何使用。比如,假设有一个产品价格表,用户想根据产品ID查找对应的价格。这时候,VLOOKUP就可以在ID列查找,然后返回价格列的数据。同时,要提醒用户注意表格范围最好使用绝对引用,比如$A$2:$C$100,这样在拖动公式时范围不会变化。 可能遇到的问题也需要考虑。比如,如果查找值不在表格的第一列,或者列索引号超过了表格的列数,函数会返回错误。此外,数据格式不一致也可能导致问题,比如查找值是数字,而表格中是文本格式的数字,这时候需要统一格式。还有,当出现#N/A错误时,可能是查找值不存在,或者匹配模式设置不正确,需要检查参数是否正确。 用户可能还会问到如何避免常见的错误,比如部分数据匹配出错的情况。这时候需要检查是否有多余的空格,或者数据格式不一致,或者表格范围没有锁定导致拖动时偏移。此外,XLOOKUP作为VLOOKUP的升级版,可能在某些情况下更方便,比如可以向左查找或者返回多列数据,这也是可以提及的内容。 最后,整理步骤,从基础语法到参数说明,再到具体案例,逐步引导用户理解如何使用VLOOKUP函数。同时,提供常见错误和解决方法,帮助用户在实际应用中避免问题。如果有必要,还可以比较VLOOKUP和其他查找函数的区别,比如HLOOKUP或XLOOKUP,但根据用户的问题,主要集中在VLOOKUP本身即可。</think>### Excel VLOOKUP函数详解 #### 一、基础语法与参数说明 VLOOKUP函数的语法为: $$=VLOOKUP(lookup\_value, table\_array, col\_index\_num, [range\_lookup])$$ 包含4个参数: 1. **lookup_value**(必填):要查找的值(如单元格引用或具体值) 2. **table_array**(必填):包含数据的表格范围(必须包含查找列和返回列) 3. **col_index_num**(必填):返回值所在列的序号(从table_array第一列开始计数) 4. **range_lookup**(可选):匹配类型 - `TRUE`/`1`:近似匹配(默认值,需数据升序排列) - `FALSE`/`0`:精确匹配(常用选项) [^1][^2] #### 二、使用步骤演示(工资表查询案例) 假设需要根据员工编号查询工资: 1. 建立查询单元格(如`B12`) 2. 输入公式: ```excel =VLOOKUP(A12, $A$2:$D$100, 4, 0) ``` - `A12`:待查询的员工编号 - `$A$2:$D$100`:锁定数据区域(绝对引用) - `4`:返回第4列(工资列) - `0`:精确匹配 [^2][^3] #### 三、常见错误与解决方法 | 错误现象 | 原因 | 解决方案 | |---------|------|---------| | #N/A | 查找值不存在 | 检查数据源或改用`IFERROR`容错 | | #REF! | 列序号超出范围 | 确认col_index_num ≤ 表格列数 | | 部分匹配失败 | 数据格式不一致 | 统一数值/文本格式 | | 结果错位 | 表格未锁定 | 使用`$`符号固定区域引用 | [^3][^4] #### 四、进阶技巧 1. **多条件查询**: 使用辅助列合并多个条件字段 ```excel =VLOOKUP(A2&B2, $D$2:$F$100, 3, 0) ``` 2. **通配符匹配**: `"*"`匹配任意字符,`"?"`匹配单个字符 ```excel =VLOOKUP("张*", $A$2:$C$100, 3, 0) ``` 3. **跨表查询**: 引用其他工作表数据 ```excel =VLOOKUP(A2, Sheet2!$A$2:$D$100, 4, 0) ``` [^1][^4]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值