KeyError beim Zugriff auf inneren Multiindex
Verfasst: Montag 25. Januar 2021, 18:16
Hi,
wenn ich mitversuche auf den inneren Index einen Multindex im df zuzugreifen bekomme ich immer einen KeyError.
Der df sieht folgendermaßen aus:
Letztendlich möchte ich für jeden Tag, an dem Messwerte vorliegen, mittels Subplot einen eigenen Graphen erzeugen. Nachfolgend der komplette Code.
Vielen Dank für eure Hilfe.
Krischanb
wenn ich mit
Code: Alles auswählen
dfn.loc[slice(None),"2020-12-01 22:10"]
Der df sieht folgendermaßen aus:
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.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
...
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())
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=' ')
Krischanb