KeyError beim Zugriff auf inneren Multiindex

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
krischanb
User
Beiträge: 12
Registriert: Samstag 9. Januar 2021, 18:38

Hi,
wenn ich mit

Code: Alles auswählen

dfn.loc[slice(None),"2020-12-01 22:10"]
versuche auf den inneren Index einen Multindex im df zuzugreifen bekomme ich immer einen KeyError.

Der df sieht folgendermaßen aus:
Temperatur Einheit
Sensor Zeitpunkt
Blau 2020-12-01 22:00 18.62 °C
2020-12-01 22:10 18.62 °C
2020-12-01 22:20 18.56 °C
2020-12-01 22:30 18.50 °C
2020-12-01 22:40 18.44 °C
...
Gibt es für die Ermitlung eines jeden Tages eine elegantere Lösung als über die Iteration? Ich habe gelesen, dass in Pandas Iterationen nur selten erforderlich sind.

Code: Alles auswählen

Sensoren=list(set(df.index.get_level_values(level="Sensor")))

Messtag = []
for x in range(0,len(df.index.values.tolist()),1):
    if pd.to_datetime(df.index.values.tolist()[x][1]).date() not in Messtag:
        Messtag.append(pd.to_datetime(df.index.values.tolist()[x][1]).date())
Letztendlich möchte ich für jeden Tag, an dem Messwerte vorliegen, mittels Subplot einen eigenen Graphen erzeugen. Nachfolgend der komplette Code.

Code: Alles auswählen

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import time

LOG_FILENAME = "D:/Python/temperaturlog.txt"
UNIT = "°C"
data = pd.read_csv(
    LOG_FILENAME,
    delimiter = ";",
    index_col = ["Sensor"],
    parse_dates = {"Zeitpunkt": ["Datum","Uhrzeit"]},
    decimal=",",
    encoding="utf-8",
    dayfirst=True,
    )

if (data["Einheit"] != UNIT).any():
    raise ValueError(f"expected unit {UNIT!r} for all records")

start=time.time()

df=pd.DataFrame(data)
df["Zeit"] = df["Zeitpunkt"].dt.strftime("%H:%M")
df["Zeitpunkt"] = df["Zeitpunkt"].dt.strftime("%Y-%m-%d %H:%M")
df.set_index(["Zeitpunkt","Zeit"],append=True, inplace=True)
df = df.sort_index()


Sensoren=list(set(df.index.get_level_values(level="Sensor")))

Messtag = []
for x in range(0,len(df.index.values.tolist()),1):
    if pd.to_datetime(df.index.values.tolist()[x][1]).date() not in Messtag:
        Messtag.append(pd.to_datetime(df.index.values.tolist()[x][1]).date())

        
nighthours=["22:00","06:00"]
lb0 = "00:00"
ub0 = nighthours[1]
lb1 = nighthours[0]
ub1 = "23:59"

lb0 = pd.to_datetime(lb0,format = "%H:%M").time().strftime('%H:%M')
lb1 = pd.to_datetime(lb1,format = "%H:%M").time().strftime('%H:%M')
ub0 = pd.to_datetime(ub0,format = "%H:%M").time().strftime('%H:%M')
ub1 = pd.to_datetime(ub1,format = "%H:%M").time().strftime('%H:%M')

dfn = pd.concat([
    df.loc[slice(None),slice(None),lb0:ub0],
    df.loc[slice(None),slice(None),lb1:ub1]
    ])

dfn = dfn.droplevel(level="Zeit")
dfn = dfn.sort_index(level="Zeitpunkt")
dfn = dfn.sort_index(level="Sensor")

    
plt.figure(figsize=(20,9))
plt.title("Temperaturverlauf Nachts")
plt.xticks(ticks=tickvalues,rotation=45)


for x in Sensoren:
    plt.plot(dfn.loc[x,"Temperatur"],label=x)

    
plt.legend()
plt.show()

ende=time.time()
print('{:5.3f}s'.format(ende-start), end='  ')
Vielen Dank für eure Hilfe.
Krischanb
Antworten