Pandas Time Series Index Slicing - Eine Liste von Tagen aus einem DF mit minütlichen Daten herausschneiden

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
python444444
User
Beiträge: 1
Registriert: Sonntag 17. Januar 2021, 12:32

Hallo,

ich habe eine Frage zu Pandas betreffend indexing/slicing mit time series Daten.


Der time series index ist im Format "2019-12-31 16:14:00", der Dataframe enthält minütliche Daten von jedem Tag.

Ich möchte eine Reihe von bestimmten Tagen aus dem Dataframe herausschneiden und für eine Analyse verwenden.

mit slice = df.loc["2020-12-31"] funktioniert dies perfekt für einen einzelnen Tag, slice enthält alle minütlichen Daten des 31.12.2020.

Auch slice2 = df.loc["2019-12-31":"2019-12-30"] scheint zu funktionieren und liefert mir in slice2 alle Reihen der beiden Tage.

Was ich jedoch eigentlich brauche ist slice3 = df.loc["2020-12-31", 2020-12-28", "2020-12-24", "2020-11-13"] also eine Liste mit vielen unabhängigen Tagen.

Dies scheint in Pandas nicht zu funktionieren und meine Frage ist ob es einen Trick gibt um das gleiche Ergebnis zu erreichen?

Es funktioniert mit vollständigen time stamps:

slice4 = df.loc[["2019-12-31 10:00:00", "2019-12-11 12:09:00", "2019-12-13 12:11:00"]] aber das hilft mir leider nicht weiter, dann würde ich ja für jeden Tag 1440 einzelne Timestamps eingeben müssen (wobei das im Notfall sogar mit der range Funktion machbar wäre?).

Falls es keine Möglichkeit gibt Pandas da irgendwie auszutricksen bin ich auch sehr Dankbar für Vorschläge wie man eine For-Schleife gestalten könnte die das gleiche Ergebnis erzielen kann, damit kenne ich mich leider noch nicht so gut aus.

Achso, insgesamt geht es um etwa 100 Tage die ich aus dem Dataframe brauche möchte falls das relevant ist.

Vielen Dank schonmal im Voraus!
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Also ich glaube Ich kann dir Theoretisch helfen das Problem ist leider das Ich deine Frage nicht ganz verstehe ...

1.)
Was ich jedoch eigentlich brauche ist slice3 = df.loc["2020-12-31", 2020-12-28", "2020-12-24", "2020-11-13"] also eine Liste mit vielen unabhängigen Tagen.
Also eigentlich ganz simpel du warst schon auf dich richten weg.

Code: Alles auswählen

    liste_mit_tage = [""2020-12-31", 2020-12-28", "2020-12-24", "2020-11-13""]
    for i in liste_mit_tage:
        print(datensatz.loc[i])
Ich verstehe leider nicht also was du die "heraus geschnittenen " Daten haben möchtest deswegen habe Ich es in dem Fall mit print symbolisiert du kannst natürlich einer Liste,Series,dict,Dataframe etc einfach hinzufügen.

Natürlich könntest du vorher auch einfach eine for schleife schreiben die dir die Liste mit tagen erzeugt etwas als beispiel

Code: Alles auswählen

import calendar
letzer_tag_des_monats = calendar.monthrange(2002, 1)[1] 
Gibt dir den letzten Tag eines Monats wieder ....


Naja weiter:

Code: Alles auswählen

slice4 = df.loc[["2019-12-31 10:00:00", "2019-12-11 12:09:00", "2019-12-13 12:11:00"]] aber das hilft mir leider nicht weiter, dann würde ich ja für jeden Tag 1440 einzelne Timestamps eingeben müssen (wobei das im Notfall sogar mit der range Funktion machbar wäre?). 
Verstehe Ich leider wieder nicht ganz möchtest du Daten für jeden Tag zu einer bestimmten Uhrzeit ? Wenn ja:

Code: Alles auswählen

import pandas as pd
from pathlib import Path

fertigdaten = Path(r"C:\Users\Marcel\Desktop\Fertigdaten\Fertigdaten_2020_04.wrt")

INTERVALLE = {
    "TAG": "D",
    "Uhrzeit_1": "06:00:00",
    "Uhrzeit_2": "06:50:00",
    "Uhrzeit_3": "13:50:00",
    "Uhrzeit_4": "20:50:00",
    "Uhrzeit_5": "23:59:00",
}


def daten_einlesen(pfad_fertigdaten):
    datensatz = pd.read_csv(
        pfad_fertigdaten,
        sep="|",
        header=None,
        parse_dates=True,
        low_memory=False,
        na_values="******",
    )
    datensatz[0] = pd.to_datetime(datensatz[0])
    datensatz = datensatz.set_index(0)
    return datensatz


def daten_mit_anderen_zeitindex(ausgelesene_daten, spalte, intervall):
    """
    Wir extrahieren die übergebene kanalnummer aus dem übergebenen Datensatz,danach erstellen wir einen neuen Index
    in abhängigkeit von dem Übergebenen intervall und legen diesen über die extrahierten_daten.
    Beispiel:
    Wir übergebenen Uhrzeit_2 = "06:50:00" dann sieht unsere Series am Ende wie folgt aus
    2020-04-01 06:50:00    1.56
    2020-04-02 06:50:00    5.02
    2020-04-03 06:50:00    5.95
    ...
    """

    extrahierte_daten = ausgelesene_daten[spalte]
    extrahierte_daten = pd.to_numeric(extrahierte_daten, errors='coerce').astype(
        "float")  # leer strings führen zu fehlern
    neuer_index = extrahierte_daten.index.indexer_at_time(time=intervall)
    extrahierte_daten_mit_neuem_index = pd.Series(extrahierte_daten.iloc[neuer_index], dtype=float)
    extrahierte_daten_mit_neuem_index = extrahierte_daten_mit_neuem_index.replace(-1, "******")
    print(extrahierte_daten_mit_neuem_index)


def main():
    datensatz = daten_einlesen(fertigdaten)
    daten_mit_anderen_zeitindex(datensatz,1,INTERVALLE.get("Uhrzeit_2"))


if __name__ == '__main__':
    main()
Ist ein alter Code von mir :

Ausgabe sieht wie folgt aus :

Code: Alles auswählen

2020-04-01 06:50:00     1.81
2020-04-02 06:50:00     5.10
2020-04-03 06:50:00     6.02
2020-04-04 06:50:00     3.93
2020-04-05 06:50:00     8.05
2020-04-06 06:50:00    10.91
2020-04-07 06:50:00     8.74
2020-04-08 06:50:00    11.61
2020-04-09 06:50:00     8.56
2020-04-10 06:50:00     4.07
2020-04-11 06:50:00     6.49
2020-04-12 06:50:00     9.95
2020-04-13 06:50:00     6.30
2020-04-14 06:50:00     5.24
2020-04-15 06:50:00      NaN
2020-04-16 06:50:00      NaN
2020-04-17 06:50:00     6.19
2020-04-18 06:50:00     7.71
2020-04-19 06:50:00     8.48
2020-04-20 06:50:00     7.90
2020-04-21 06:50:00     9.96
2020-04-22 06:50:00    11.15
2020-04-23 06:50:00    13.05
2020-04-24 06:50:00    10.83
2020-04-25 06:50:00     8.77
2020-04-26 06:50:00     7.68
2020-04-27 06:50:00    10.98
2020-04-28 06:50:00     9.99
2020-04-29 06:50:00     9.22
2020-04-30 06:50:00    10.41
Name: 1, dtype: float64

Da Ich eventuell auch ander Zeilen habe die dich und das Forum interessieren können haue Ich mal alles raus :

Falls du später einen Tag zusammenfassen willst -> zum Beispiel die summe von werten pro Tag:

Code: Alles auswählen

	sonnenschein = datensatz[1]
    	sonnenschein = sonnenschein.groupby(pd.Grouper(freq=INTERVALLE.get("TAG"))).sum(min_count=1)  # mindestens 1 nicht nan value


Und die letzte Methode dir mir zu deinem Problem einfällt date_range:

Code: Alles auswählen

index = pd.date_range(start="2018-01-01",end="2018-01-15",freq="D")
series_mit_neuem_index = pd.Series(range(len(index)), index=index)

Ich hoffe Ich konnte dir helfen
Eine Vision ohne Aktion bleibe eine Illusion
Antworten