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!
Pandas Time Series Index Slicing - Eine Liste von Tagen aus einem DF mit minütlichen Daten herausschneiden
Also ich glaube Ich kann dir Theoretisch helfen das Problem ist leider das Ich deine Frage nicht ganz verstehe ...
1.)
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
Gibt dir den letzten Tag eines Monats wieder ....
Naja weiter:
Verstehe Ich leider wieder nicht ganz möchtest du Daten für jeden Tag zu einer bestimmten Uhrzeit ? Wenn ja:
Ist ein alter Code von mir :
Ausgabe sieht wie folgt aus :
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:
Und die letzte Methode dir mir zu deinem Problem einfällt date_range:
Ich hoffe Ich konnte dir helfen
1.)
Also eigentlich ganz simpel du warst schon auf dich richten weg.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.
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])
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]
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?).
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()
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