def add(t0, t1, res): dt0 = oldy.str_to_datetime(t0.dt) dt1 = oldy.str_to_datetime(t1.dt) # print(dt0, dt1, dt1 - dt0, dt1 - dt0 >= GAP) if t1.num == t0.num: # количество включений не изменилось # присваиваем часам с dt0.replace по dt1.replace # print("Заполнено предыдущим", t1, t0) # прикол - мы в любом случае знаем значение для предыдущего часа i = dt0.replace(**ROUND_H) while i <= dt1.replace(**ROUND_H): res[i] = res[dt0.replace(**ROUND_H)] i += ONE_HOUR else: # вариант номер раз: заполним пустышками if dt1 - dt0.replace(**ROUND_H) >= GAP: i = (dt0 + ONE_HOUR).replace(**ROUND_H) while i <= dt1.replace(**ROUND_H): print("Заполнено None", i) res[i] = None i += ONE_HOUR # вариант 2: аппроксимируем else: # F(th) = F1 - (t1 - th) * k, где k = (F(t1) - F(t0)) / (t1 - t0) interval = minutes_timdelta(dt1, dt0) k = (t1.num - t0.num) / interval # print("k = ", k) # print("interval = ", interval) th = dt1.replace(**ROUND_H) # print(th, dt1, "th - t1 = ", minutes_timdelta(dt1, th)) res[th] = t1.num - k * minutes_timdelta(dt1, th)
def stats_from_list(lst: list): abs_stats = defaultdict(deque) rel_stats = {} for lift_id, dt, num in lst: num = int(num) #YYYY-mm-dd HH:MM:SS dt = dt[:16] dt = oldy.str_to_datetime(dt) add_abs_dirty(abs_stats[lift_id], dt, num) #add_rel(rel_stats[lift_id]), dt, num) return abs_stats
def events_from_list(lst: list): events = {} current = {} for _, dt, flag, num in lst: num = int(num) flag = int(flag) dt = (oldy.str_to_datetime(dt)).replace(second=0, minute=0) if oldy.is_defect_start(num, flag): current[num] = True elif oldy.is_defect_stop(num, flag): current[num] = False #print(dt, lift) events[dt] = current.copy() return events
def read_stats(lift_input): raw_stats = oldy.csvfile_to_list(lift_input + '.csv', 'win') # читаем файл в список stats = iter(raw_stats) next = stats.__next__() t0 = record(next[1], int(next[2])) t0_hour = t0.dt[11:13] # Допущение - независимо от минуты в самом первом измерении, это значение записывается в res[час] res = {oldy.str_to_datetime(t0.dt).replace(**ROUND_H): t0.num} while True: try: next = stats.__next__() t1 = record(next[1], int(next[2])) t1_hour = t1.dt[11:13] while t1_hour == t0_hour: next = stats.__next__() t1 = record(next[1], int(next[2])) t1_hour = t1.dt[11:13] # print(t0.dt, t0.num, t1.dt, t1.num, '\n') add(t0, t1, res) t0 = t1 t0_hour = t1_hour except StopIteration: break # print("res start") # for dt in sorted(res): # print(dt, res[dt], sep=';') # print(("res end")) return res
def liftstats_from_list(lst: list, first_date: datetime, last_date: datetime, use_last=True) -> dict: lifts = {} for lift_id, dt, num in lst: if lift_id not in lifts: lifts[lift_id] = Timeseries(first_date, last_date, timedelta(hours=1), 'XXX') num = int(num) dt = dt[:13] dt = oldy.str_to_datetime(dt) # это ускоряет обработку в 3 раза # в часе может быть несколько записей # add_abs # add_rel if use_last: # мы или перезапишем последней lifts[lift_id][dt] = num else: if lifts[lift_id][dt] == 'XXX': # значение по-умолчанию lifts[lift_id][dt] = num return lifts