太极线当值计算

# -*- 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