For loop mit timestamps

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Johannes.Schwenzer
User
Beiträge: 2
Registriert: Dienstag 16. April 2019, 17:41

Hallo,

ich versuche leider schon seit Stunden einen einfachen loop zu bauen in dem eine Formel jeweils mit unterschiedlichen timestamps nacheinander rechnet.
der Code sieht folgendermaßen aus:

Code: Alles auswählen

import pvlib
from pvlib.location import Location
import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt


timesteps = 9
df3=pd.read_csv('Strahlungsdaten.csv' )
y= df3['Messdatum'] 

for i in range(timesteps):
   
    times = pd.Timestamp(y[i])
    x[i] = pvlib.solarposition.get_solarposition(times, location.latitude, location.longitude, 
     altitude=None, pressure=None, method='nrel_numpy', temperature=12)
  
wenn ich x mit einem Timestamp berechne erhalte ich einen Dataframe mit 6 Spalten.
wenn ich x über den for loop berechne eine serie.
wenn ich zuerst einen leeren dataframe für x erstelle und dann über den loop füllen möchte kommt folgender Fehler:

Code: Alles auswählen

 ValueError: Wrong number of items passed 6, placement implies 1 
Ziel ist das x ein dataframe oder eine serie mit den 6 Ergebnissen der Berechnung wird.



Danke für eure Hilfe
Johannes.Schwenzer
User
Beiträge: 2
Registriert: Dienstag 16. April 2019, 17:41

Hallo,

Hier eine Lösung

Code: Alles auswählen

x= pd.DataFrame()
x2= pd.DataFrame()
for i in range(timesteps):
   
    times = pd.Timestamp(y[i])
    x = pvlib.solarposition.get_solarposition(times, location.latitude, location.longitude, 
     altitude=None, pressure=None, method='nrel_numpy', temperature=12)
   
    x2= x2.append(pd.DataFrame(x))
Benutzeravatar
__blackjack__
User
Beiträge: 14237
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Johannes.Schwenzer: Die erste Zuweisung an `x` macht keinen Sinn.

Das wiederholte `append()` in der Schleife ist potentiell ineffizient. Das mit dem `range()` und der Indirektion über einen Indexzugriff sieht „unpythonisch“ aus.
“Ich bin für die Todesstrafe. Wer schreckliche Dinge getan hat, muss eine angemessene Strafe bekommen. So lernt er seine Lektion für das nächste Mal.” — Britney Spears, Interview in der französischen Zeitung Libération, 2. April 2002
Benutzeravatar
ThomasL
User
Beiträge: 1384
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Da man pd.DataFrame auch ein Dict übergeben kann, bietet sich eine Dictionary Comprehension an,
mit dem Ergebnis, dass die Spalten jeweils auch ein Label haben.

Code: Alles auswählen

x = {str(i):pvlib.solarposition.get_solarposition(pd.Timestamp(y[i]), location.latitude, location.longitude, altitude=None, pressure=None, method='nrel_numpy', temperature=12) for i in range(timesteps)}
df = pd.DataFrame(x)
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sirius3
User
Beiträge: 18329
Registriert: Sonntag 21. Oktober 2012, 17:20

@Johannes.Schwenzer: wenn man was mit den einzelnen Werten machen will, nimmt man `map`:

Code: Alles auswählen

df3 = pd.read_csv('Strahlungsdaten.csv' )
df3['solarposition'] = df3['Messdatum'].map(lambda date: pvlib.solarposition.get_solarposition(date, location.latitude, location.longitude, 
     altitude=None, pressure=None, method='nrel_numpy', temperature=12))
oder über partial:

Code: Alles auswählen

from functools import partial
df3 = pd.read_csv('Strahlungsdaten.csv' )

get_solarposition = partial(pvlib.solarposition.get_solarposition,
    latitude=location.latitude, longitude=location.longitude) # der Rest sind sowieso die Defaults.

df3['solarposition'] = df3['Messdatum'].map(get_solarposition)
Ich würde Dir empfehlen, ein Pandas-Tutorial durchzuarbeiten, um mal zu sehen welche "Tricks" es gibt.
Antworten