用户inpu上的处理数据

2024-05-11 03:28:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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

示例文件:

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)

这里我有详细的停机时间分钟,我想转换成百分比,直到日期。例如->

用户输入:

2016年9月1日、2016年11月1日、2016年1月1日

输出:

 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

我被困在这一部分,这是可以实现的吗?任何帮助都太好了!你知道吗


Tags: tofromdatadatetimedateifisas
1条回答
网友
1楼 · 发布于 2024-05-11 03:28:04

如果用processText()而不是date来运行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),这将检查directionDOWN还是UP或两者兼而有之(word = None

def processText(lines, selected_date, word="DOWN"):

    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 not word or word == direction:

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

    # calculate total number of minutes when it was down and up
    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, "DOWN")
        percentage = (down/total_down) * 100
        txt += "Total Downtime is {} min from {} ({:.2f}%)\n".format(down, start, percentage)

    textVar.set(txt)

相关问题 更多 >