# -*- coding: UTF-8 -*- # taiji_calc.py import datetime import sys holiday_file = '节假日.txt' scale = 2 #默认保留两位小数点 holiday_list = [] def read_holiday(): fobj = open(holiday_file, 'r') for each_line in fobj: line_list = each_line.split(',') for one_day in line_list: holiday_list.append(one_day.strip()) def convert_date(str_date): "将%Y%m%d或%m%d格式的字符串转换成Date对象,如果%m%d格式的月份大于当前月,则年份默认为去年,否则为今年" today = datetime.date.today() if len(str_date) == 4: if int(str_date[0:2]) > today.month: str_date = str(today.year - 1) + str_date else: str_date = str(today.year) + str_date return datetime.datetime.strptime(str_date, '%Y%m%d') def workday_count(start_date, end_date): "计算两个日期之间(含)包含的工作日个数" date3 = start_date delta1 = 0 while date3 < end_date: date3 = date3 + datetime.timedelta(days=1) if is_workday(date3): delta1 += 1 return delta1 def is_workday(theDate): "判断某个日期是否是工作日" str_date = datetime.date.strftime(theDate, '%Y%m%d') return theDate.weekday() < 5 and holiday_list.count(str_date) == 0 def covert_float2str(float_value): "将浮点数转换为字符串,保留的小数位数默认为2,可以由命令行参数覆盖" float_value = round(float_value, scale) template = '%.' + str(scale) + 'f' return template % float_value def next_day(current_day, is_forward): if is_forward: current_day = current_day + datetime.timedelta(days=1) else: current_day = current_day - datetime.timedelta(days=1) return current_day def next_workday(current_day, is_forward): current_day = next_day(current_day, is_forward) while not is_workday(current_day): current_day = next_day(current_day, is_forward) return current_day def is_same_day(day1, day2): return day1.year == day2.year and day1.month == day2.month and day1.day == day2.day if __name__ == '__main__': read_holiday() if len(sys.argv) >= 5: date1 = convert_date(sys.argv[1]) va = float(sys.argv[2]) date2 = convert_date(sys.argv[3]) vb = float(sys.argv[4]) else: str_input = input('请依次输入A点日期、A点值、B点日期、B点值,用空格隔开(例如:1205 36.16 1213 40.28):\r\n') values = str_input.split(' ') date1 = convert_date(values[0]) va = float(values[1]) date2 = convert_date(values[2]) vb = float(values[3]) if len(sys.argv) >=6 : scale = int(sys.argv[5]) #输出的数据中,要保留的小数位数,不给参数则默认为2 current_workday = datetime.datetime.today() if not is_workday(current_workday): current_workday = next_workday(current_workday, False) pre_workday = next_workday(current_workday, False) next_workday = next_workday(current_workday, True) recent_list = [] delta1 = workday_count(date1, date2) list1 = [] date3 = date2 delta2 = 1 for i in range(1, 60): date3 = date3 + datetime.timedelta(days=1) if is_workday(date3): vc = (vb - va) * (delta1 + delta2) / delta1 + va vc1 = vc * 0.999 vc2 = vc * 1.001 str_date = date3.strftime('%Y-%m-%d') output = str_date + '当值:' + covert_float2str(vc) + ' (' + covert_float2str(vc1) + '~' + covert_float2str(vc2) + ')' print(output) delta2 += 1 if (is_same_day(date3, pre_workday) or is_same_day(date3, current_workday) or is_same_day(date3, next_workday)): recent_list.append(output) print('-----------------------------------') for out_info in recent_list: print(out_info)
太极线当值计算
猜你喜欢
转载自samjavaeye.iteye.com/blog/2347972
今日推荐
周排行