Kódím.cz
8

Datum a čas a metoda shift

Naučíme se pracovat s datem a časem a porovnávat data v různých řádcích tabulky

Metoda shift

Uvažujme nyní, že chceme vypočítat délku nějakého výpadku. Určitou komplikací je, že začátek a konec jednoho výpadku je na různých řádcích, nemůžeme tedy postupovat jako při běžném výpočtu. Můžeme ale použít metodu shift(), která umí data v jednom sloupci posunout nahoru nebo dolů.

import pandas as pd

signal_monitoring = pd.read_csv("signal_monitoring.csv")
signal_monitoring["event_date_time"] = pd.to_datetime(signal_monitoring["event_date_time"])

Nyní použijeme metodu shift() na sloupec event_date_time. Pomocí metody pak přidáme k tabulce nový sloupec. Nejdůležitějším parametrem metody je parametr periods, který může mít kladnou nebo zápornou hodnotu.

  • Kladná hodnota parametru periods znamená, že hodnoty budou posunuty směrem dolů.
  • Záporná hodnota parametru periods znamená, že hodnoty budou posunuty směrem nahoru.

Pro náš případ bude ideální, pokud posuneme hodnoty sloupce event_date_time o jeden řádek směrem nahoru. Tím zajistíme, že pokud má sloupec event_type hodnotu signal lost, uvidíme v jednom řádku začátek i konec výpadku. Tím pádem bude stačit tyto hodnoty od sebe odečíst. Pro event_type signal restored nebude mít tato hodnota smysl, ale to nevadí, tyto řádky můžeme pomocí dotazu z tabulky odfiltrovat.

signal_monitoring["event_end_date_time"] = signal_monitoring["event_date_time"].shift(periods=-1)

Opět v datech ponecháme pouze řádky, které mají ve sloupci event_type hodnotu signal lost.

signal_monitoring_signal_lost = signal_monitoring[signal_monitoring["event_type"] == "signal lost"]

Nyné můžeme spočítat rozdíl mezi začátkem výpadku a koncem výpadku, který udává jeho délku.

signal_monitoring["outage_length"] = signal_monitoring["event_end_date_time"] - signal_monitoring["event_date_time"]

Typ hodnoty ve sloupci outage_length je označovaný jako timedelta. Tento typ hodnoty označuje rozdíl mezi dvěma hodnotami typu datetime.

signal_monitoring_signal_lost.groupby("date")["outage_length"].sum()

Příklad řešení s využitím ChatGPT je zde.