#!usr/bin/env python
# encoding:utf-8
# from __future__ import division
import requests
import json
from dateutil.relativedelta import relativedelta
import math
import logging
import os
import sys
# from datetime import datetime
from odps import ODPS,DataFrame
import collections
import time
import datetime
day_list=[]
month_list = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]
month_day_dict = {
"01": 31,
"02": 28,
"03": 31,
"04": 30,
"05": 31,
"06": 30,
"07": 31,
"08": 31,
"09": 30,
"10": 31,
"11": 30,
"12": 31,
}
def string2Datetime(timestamp, format="%Y-%m-%d %H:%M:%S"):
# """
# 把字符串转成datetime
# """
return datetime.datetime.strptime(timestamp, format)
def judgeRunYear(year):
# """
# 判断是否是闰年
# """
if (year % 100 != 0 and year % 4 == 0) or (year % 100 == 0 and year % 400 == 0):
return True
else:
return False
def generateMonthDays(month_day_dict, year="2017", month="03"):
# """
# 生成指定年份、月份中的所有日期
# """
day_num = month_day_dict[month]
day_date_list = []
for i in range(1, day_num + 1):
one = str(i)
if len(one) == 1:
one = "0" + one
day_date_list.append(year + "-" + month + "-" + one)
return day_date_list
def genenrateYearDays(year):
# """
# 生成一年中所有的日期
# """
res_list = []
if judgeRunYear(year):
month_day_dict["02"] = 29
for one_mon in month_list:
one_mon_day = generateMonthDays(month_day_dict, year=str(year), month=one_mon)
res_list += one_mon_day
return res_list
def singleDateHandle(day="2019-07-19", format="%Y-%m-%d"):
# """
# 单日处理
# """
T = string2Datetime(day, format=format)
weekDay = T.weekday() + 1
weekNum = T.isocalendar()[1]
return weekDay, weekNum
def genenrateYearDaysWeek(year):
# """
# 计算生成一年中每一天属于 第几周 周几
# """
year_day_list = genenrateYearDays(year)
for one_day in year_day_list:
weekDay, weekNum = singleDateHandle(day=one_day)
weekOfMonth = get_week_of_month(year= int(one_day[0:4]), month=int(one_day[5:7]), day=int(one_day[8:10]))
print("{0} is: {1}th week, {2}th day, {3}th weekofmonth.".format(one_day, weekNum, weekDay,weekOfMonth))
obj={"date":one_day,"weekth":weekNum,"weekday":weekDay,"weekofmonth":weekOfMonth}
day_list.append(obj)
def get_week_of_month(year, month, day):
"""
获取指定的某天是某个月的第几周
"""
begin = int(datetime.date(year, month, 1).strftime("%W"))
end = int(datetime.date(year, month, day).strftime("%W"))
return end - begin + 1
if __name__ == "__main__":
date='${bizdate}'
year=date[0:4]
print(int(year))
genenrateYearDaysWeek(int(year))
print(len(day_list))
# 增加odps引擎
maxcompute_db = ODPS('码', '码', "${syc_ods}",endpoint='https://码/api')
insert_sql = ''
data_lists = []
# 遍历插入odps表
for obj in day_list:
mdate=datetime.datetime.strptime(str(obj["date"]),'%Y-%m-%d')
weekth=str(obj["weekth"])
weekday=str(obj["weekday"])
weekofmonth = str(obj['weekofmonth'])
data_list = "(uuid(), '" + str(mdate) + "','" + weekth + "','" + weekday + "','" + weekofmonth + "',null,null,null,null,null,null,null),"
data_lists.append(data_list)
print("准备执行SQL")
insert_sql = 'insert OVERWRITE table ${syc_ods}.ods_year_day_list partition(ds=${bizdate}) values {}'.format('\n'.join(data_lists))
insert_sql=insert_sql[0:len(insert_sql)-1]
# print(insert_sql)
# 执行SQL
maxcompute_db.execute_sql(insert_sql)
print("成功执行SQL")
# from datetime import datetime
# time = '20190801'
# date = datetime.strptime(time,'%Y%m%d')
# CREATE TABLE IF NOT EXISTS syc_ods_dev.ods_year_day_list (
# id STRING COMMENT '主键',
# mdate datetime COMMENT '日期',
# weekth int COMMENT '第几周',
# weekday int COMMENT '星期几',
# weekofmonth int COMMENT '本月第几周',
# vacation_name int COMMENT '接入标记',
# legal_holidays int COMMENT '是否法定假日',
# res1 STRING comment '备用字段1',
# res2 STRING comment '备用字段2',
# res3 STRING comment '备用字段3',
# res4 STRING comment '备用字段4',
# res5 STRING comment '备用字段5')
# COMMENT '生成全年日历表' PARTITIONED BY (ds STRING COMMENT '分区');
python生成全年日期表
于 2022-01-07 10:41:55 首次发布