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