处理用户输入的数据

时间:2017-12-26 19:40:58

标签: python python-3.x python-2.7 tkinter

我有一个场景,我上传文本文件,然后提供用户输入,然后根据用户输入处理进一步。

示例文件:

DOWN 07.09.2016 08:21:33 - 07.09.2016 08:23:33
UP   07.11.2016 09:41:07 - 09.11.2016 09:20:33
DOWN 09.11.2016 08:26:33 - 09.11.2016 08:46:33
UP   09.11.2016 08:23:33 - 09.11.2016 08:25:33
DOWN 09.11.2016 08:36:33 - 09.11.2016 08:41:33
DOWN 10.11.2016 08:36:33 - 10.11.2016 08:39:33

代码:

try:
    import Tkinter as Tk
    import tkFileDialog as fileDialog
except ImportError:
    import tkinter as Tk
    import tkinter.filedialog as fileDialog

import datetime



def read_data():
    '''
    Read data from file and convert to list with datetime
    which can be used to calculate time and display.
    '''
    global data

    filename = fileDialog.askopenfilename()

    if filename:
        # read all lines
        with open(filename) as fileHandle:
            lines = fileHandle.readlines()

        # convert to `datetime` (not `timestamp`)
        data = []        
        for line in lines:
            #direction = line[:4].strip()
            #dt1 = line[5:24]
            #dt2 = line[27:46]

            direction, d1, t1, _, d2, t2 = line.split()
            dt1 = d1 + ' ' + t1
            dt2 = d2 + ' ' + t2 

            t1 = datetime.datetime.strptime(dt1, "%d.%m.%Y %H:%M:%S")
            t2 = datetime.datetime.strptime(dt2, "%d.%m.%Y %H:%M:%S")

            seconds = (t2-t1).seconds

            data.append([direction, t1, t2, seconds])

        print(data)


def processText(lines, selected_date):

    total = 0
    start = None

    print(selected_date)
    # if there is `selected_date` then convert to `datetime`
    if selected_date:
        try:
            selected_date = datetime.datetime.strptime(selected_date, "%d.%m.%Y")
        except AttributeError as ex:
            print("ERROR:", ex)
            selected_date = None

    # calculate time
    for direction, t1, t2, seconds in lines:

        if direction == "DOWN":

            # if `selected_date` then filter times
            if selected_date and t1 <= selected_date:
                continue

            if not start:
                start = t1.strftime("%d.%m.%Y %H:%M:%S")

            total += seconds

    # convert to minutes after summing all second
    total = total//60

    return total, start

def calculate():

    all_dates = entry.get().split(',')
    print(all_dates)
    all_dates = [date.strip() for date in all_dates]

    txt = ''

    for current_date in all_dates:
        down, start = processText(data, current_date)
        txt += "Total Downtime is {0} min from {1}\n".format(down, start)

    textVar.set(txt)

# --- main ---

data = None # to keep data from file

# -

root = Tk.Tk()

button = Tk.Button(root, text="Open", command=read_data)
button.grid(column=1, row=1)

textVar = Tk.StringVar(root)

label = Tk.Label(root, textvariable=textVar)
label.grid(column=1, row=2)

entry = Tk.Entry(root)
entry.grid(column=1, row=3)

button2 = Tk.Button(root, text="Calculate", command=calculate)
button2.grid(column=1, row=4)

root.mainloop()

上面的代码提示我选择日期格式为Date1.Month1.Year1,Date2.Month2.Year2 ...(取决于日期输入的数字。)

并将输出返回为:

 Total Downtime is x min from date1.month1.year1 xx:xx:xx(time1)
 Total Downtime is y min from date2.month2.year2 yy:yy:yy(time2)

这里我详细了解了分钟的停机时间,我希望将其转换为百分比直至日期。例如 - &gt;

用户输入:

1.9.2016,1.11.2016,1.1.2016

输出:

 Total Downtime is 30 min from 1.9.2016 08:21:33 & Availability percentage from selected date to till date : xx.xxx% 
 Total Downtime is 28 min from 1.11.2016 08:26:33 & Availability percentage from selected date to till date : yy.yyy%
 Total Downtime is 30 min from 1.11.2016 08:26:33 & Availability percentage from selected date to till date : zz.zzz%
可用性计算背后的逻辑

total number of min down from date(which is retrieved)/total number of min till date * 100

我被困在这一部分,这是可以实现的吗?任何帮助都会很棒!!

1 个答案:

答案 0 :(得分:1)

如果您使用processText()而非日期运行None,那么您将获得停用时的总分钟数

total_down, start = processText(data, None)

你可以用它来计算百分比。

percentage = (down/total_down) * 100

并且您可以使用字符串格式{:.2f}在点

之后仅显示两位数
def calculate():

    all_dates = entry.get().split(',')
    print(all_dates)
    all_dates = [date.strip() for date in all_dates]

    # calculate total number of minutes when it was down
    total_down, start = processText(data, None) # <-- None

    print('total_down:', total_down)

    txt = ''

    for current_date in all_dates:
        down, start = processText(data, current_date)

        # calculate percetage
        percentage = (down/total_down) * 100

        # use string formatting {:.2f} to display only two digits after dot
        txt += "Total Downtime is {} min from {} ({:.2f}%)\n".format(down, start, percentage)

    textVar.set(txt)

enter image description here

如果您想要关闭或关闭的总分钟数,则必须更改processText并添加新参数(例如。word),这将检查direction是否为{ {1}}或DOWN或两者(UP

word = None