Seite 1 von 1

KeyError beim Zugriff auf inneren Multiindex

Verfasst: Montag 25. Januar 2021, 18:16
von krischanb
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