Python Pandas, сравнивающий значения даты и времени в ячейках DataFrame - PullRequest
0 голосов
/ 26 апреля 2019

Я запускаю два набора тестов скорости и записываю данные в файлы CSV, которые затем считываю обратно и преобразую в кадры данных. Когда я отображаю данные, они выглядят так, и у меня есть 2 набора данных; один для теста № 1 и один для теста № 2

Пример таблицы результатов DataFrame

Что я хотел бы сделать, это сравнить каждую ячейку столбца теста «Время истекло» № 1 с соответствующей ячейкой столбца теста «Время истекло» № 2 и в новом отображении фрейма данных в процентах изменение (т. Е. +1.05 % или -4,72%). Я не знаю, как получить доступ к этим ячейкам и сделать какие-либо сравнения с ними, так как они странного типа данных?

Для генерации таблиц производительности я написал следующий код:

import random
import datetime as dt
import pandas as pd
import logging
import platform, psutil, GPUtil
import csv

#for debugging purposes
logging.basicConfig(filename='stressTest_LOG.txt', level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')
logging.disable(level=logging.DEBUG)

#enlarge pandas display area
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)

def passGen(passLen, randSeed):
    # randSeed = None #None uses time stamp as a value
    # passLen = 15 #password length

    random.seed(a=randSeed, version=2)

    # populate lists with character ranges based of ASCII table
    letters = list(range(65, 91)) + list(range(97, 123))
    symbols = list(range(33, 48))
    numbers = list(range(48, 58))

    passCombined = letters + symbols + numbers
    random.shuffle(passCombined)

    # check if first element is from symbol list and if so replace with a number
    while passCombined[0] > 32 and passCombined[0] < 49:
        # print("First symbol: "+ str(chr(passCombined[0])))
        passCombined[0] = random.randint(48, 58)
        # print("Changed to: "+ str(chr(passCombined[0])))

    finalPassword = passCombined[slice(passLen)]

    return finalPassword


def showPass(password):
    if len(password) > 32:
        print("Invalid password length.\nHas to be less than 32 characters.")
        return -1

    print(''.join(str(chr(e)) for e in password))



####################################### Main #######################################

# Generate CSV file
with open('performanceResults2.csv', 'w', newline='') as f:

    #declare columns in CSV file and their order
    fieldnames = ['Action', 'Start Time', 'End Time', 'Time Elapsed', 'OS',
                  'System', 'RAM', 'CPU count', 'CPU freq', 'GPU']
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()

    #gather system information
    info_architecture = platform.architecture()[0]
    info_machine = platform.machine()
    info_node = platform.node()
    info_system = platform.platform()
    info_os = platform.system()

    if info_os == 'Darwin':
        info_os = 'macOS'

    info_release = platform.release()
    info_version = platform.version()
    info_processor = platform.processor()
    info_pythonCompiler = platform.python_compiler()

    # get RAM memory info
    mem = psutil.virtual_memory().total
    mem = str(mem/(1024.**3)) + 'GB'

    # get CPU info
    cpu_count = psutil.cpu_count()
    cpu_freq = psutil.cpu_freq().current
    cpu_freq = round(cpu_freq / 1000, 2)
    cpu_freq = str(cpu_freq) + 'GHz'

    # get GPU info
    # Works only with Nvidia gpus and is based on nvidia-smi command
    gpuinfo = GPUtil.getGPUs()

    if len(gpuinfo) == 0:
        gpuinfo = 'Unsupported GPU model'

    #run random password generator program
    counter = 10000
    testCounter = 0


    #print("Test #1 Start time: " + str(startTime))


    for i in range(0,5):

        startTime = dt.datetime.now()

        while counter > 0:
            pass1 = passGen(30, None)
            #showPass(pass1)
            logging.debug('counter is: ' + str(counter) + ', password: ' + str(pass1))
            counter -= 1

        endTime = dt.datetime.now()
        #print("Test #1 End time  : " + str(endTime))

        timeDelta = endTime - startTime
        #print ("Test #1 Time elapsed: " + str(timeDelta))
        testCounter += 1
        counter = 10000
        testCounterDisplay = 'Test #' + str(testCounter)

        writer.writerow({'Action': testCounterDisplay, 'Start Time': startTime, 'End Time': endTime,
                         'Time Elapsed': timeDelta, 'OS': info_os, 'System': info_system, 'RAM': mem,
                         'CPU count': cpu_count, 'CPU freq': cpu_freq, 'GPU': gpuinfo})

#read back in and display the results
file = pd.read_csv('performanceResults2.csv', delimiter=',')
print(file)

И для сравнения результатов я получил только это:

import pandas as pd
import numpy as np

#enlarge pandas display area
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)

#read in data to compare
test1 = pd.read_csv('performanceResults1.csv', delimiter=',')
test2 = pd.read_csv('performanceResults2.csv', delimiter=',')

#check if dataframes are equal
equality = test1.equals(test2)
print('DataFrame equal: ', equality)


df1_filtered = pd.DataFrame(test1[['Time Elapsed']])
df2_filtered = pd.DataFrame(test2['Time Elapsed'])

Есть мысли?

1 Ответ

0 голосов
/ 26 апреля 2019

Не видя твой формат ячейки времени, трудно помочь Как я понимаю, ваше время приходит в формате datetime в:

 dt.datetime.now()

, если вы хотите преобразовать в метку времени панд:

 pd.to_datetime(dt.datetime.now())

Вы можете запустить это в столбцах «Время начала» и «Время окончания» и переназначить их. Проверьте .dtypes () на вашем DataFrame, это может быть «объект», затем запустите:

DF['Start Time'] = pd.to_datetime(DF['Start Time'])

после этого dtype должно быть datetime64[ns], что позволит вам производить вычисления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...