# -*- 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)
太极线当值计算
最新推荐文章于 2025-08-12 16:35:09 发布