Einlesen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Samoth
User
Beiträge: 41
Registriert: Freitag 24. November 2017, 15:13

Freitag 24. November 2017, 15:28

Hallo,
ich habe mich jetzt mal drangewagt Python näher kennenzulernen. Nun denn...
Mit Matlab hatte ich dies schon ausgewertet... das ist kein Problem. Nun wollte ich dies spaßeshalber mit Python versuchen. Allerdings hapert es vor allem an der neuen Syntaks.

Die Datei die ich einlesen möcht sieht so aus (AERONET Seite der NASA):
https://aeronet.gsfc.nasa.gov/cgi-bin/p ... 5=1&AVG=10

Da ich mehrere Daten in einem Ordner liegen habe, habe ich diese nun erst einmal in einer Liste extrahiert...

Code: Alles auswählen

startpath=("/media/sf_PHD/AERONET_DATEN")

from glob import glob
aeronetdata=glob('/media/sf_PHD/AERONET_DATEN/*.lev15')
print(aeronetdata)
length=len(aeronetdata)
Nun müsste ich die Daten "nur" noch einlesen:

Code: Alles auswählen

fobj = open(aeronetdata[1])


fobj.close()
Doch da weiß ich nicht weiter.

Kann da jemand abhilfe schaffen?

Gruß
Samoth
User
Beiträge: 41
Registriert: Freitag 24. November 2017, 15:13

Freitag 24. November 2017, 16:06

SO jetzt liest es mir alles ein... wie überspringe ich 4 zeilen?

Code: Alles auswählen

fobj = open(aeronetdata[1])
for line in fobj:
    print(line.rstrip())
fobj.close()
Bzw. separiere die Zeilen noch in einzelne Spalten. Sie sind mit einem , getrennt
Benutzeravatar
noisefloor
User
Beiträge: 2474
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Freitag 24. November 2017, 16:26

Hallo,
wie überspringe ich 4 zeilen?
Z.B. mit `islice` aus den Itertools. Sagen wir mal, deine Eingabedatei sieht so aus:

Code: Alles auswählen

eins
zwei
drei
vier
fünf
sechs
und die willst alles aber der 4. Zeile:

[codebox=pycon file=Unbenannt.txt]>>> from itertools import islice
>>> with open('numbers.txt', 'r') as f:
... for line in islice(f, 3, None):
... print(line)
...
vier

fünf

sechs

>>> [/code]
Bzw. separiere die Zeilen noch in einzelne Spalten. Sie sind mit einem , getrennt
Dann nimmst du am besten das csv-Modul, dann erhälst du die Elemente einer Zeile in einer Liste zurück.

Gruß, noisefloor
narpfel
User
Beiträge: 227
Registriert: Freitag 20. Oktober 2017, 16:10

Freitag 24. November 2017, 17:05

@Samoth: Wenn’s um Datenauswertung geht, solltest du dir das SciPy-Ökosystem angucken. Um CSVs zu parsen, kann man `numpy.loadtxt` oder `pandas.read_csv` nehmen. Da du anscheinend Zeitreihen hast, ist `pandas` wahrscheinlich am ehesten das, was du suchst.
Samoth
User
Beiträge: 41
Registriert: Freitag 24. November 2017, 15:13

Freitag 1. Dezember 2017, 10:24

Hallo,
ja, das wäre eine Option. Dachte mir allerdings das es auch mit dem Grundpython auch gehen müsste. Ich habs mal probiert, allerdings erkennt mein System das Pandas-Modul in Python3 nicht.

Das ist nun meine letzte Version... das print am Ende gibt mir allerdings ein Leerfeld aus.

Code: Alles auswählen

import sys

#Systempfad eingeben in dem die Datei liegt
startpath=("/media/sf_PHD/AERONET_DATEN")

#Suche alle .lev15-Dateien aus dem Ordner
from glob import glob
aeronetdata=glob('/media/sf_PHD/AERONET_DATEN/*.lev15')
print(aeronetdata)


pic = []


#Öffne die Zugrsiffsdatei
#Versuch des Öffnens
try:
    fobj = open(aeronetdata[1],'r')
except:
    print("Datenzugriff nicht erfolgreich! Überprüfen Sie ob Datei existiert.")
    sys.exit(0)

#Lesen aller Zeilen in eine Liste
temp= fobj.readlines()


#Umwandeln in eine Liste von Zeilen
start = False
for line in fobj:
    pic.append(int(line))
    if (start):
        temp = []
        for i in line.split(","):
            temp.append(i)
            tabelle.append(temp)
    if (line.startswith("Date")):
        start = true

print(pic)

fobj.close()
Sirius3
User
Beiträge: 8412
Registriert: Sonntag 21. Oktober 2012, 17:20

Freitag 1. Dezember 2017, 11:16

@Samoth: Pandas muß extra installiert werden. Alle Importe sollten am Anfang der Datei stehen, so dass man sofort die Abhängigkeiten sieht. Warum definierst Du `startpath` benutzt ihn aber nicht? Konstanten werden per Konvention KOMPLETT_GROSS geschrieben; die Klammern sind überflüssig.

Niemals nackte excepts benutzen, weil damit auch viele Programmierfehler verdeckt werden. Hier also explizit OSError abfangen.
Dateien sollten mit dem with-Statement geöffnet werden, dann werden sie auch automatisch wieder geschlossen.
Der Kommentar vor `temp` ist komplett richtig. Alle Zeilen werden gelesen, `temp` aber gar nicht benutzt. Die Datei ist dann ausgelesen und die for-Schleife nie betreten. Die Zeile also einfach löschen.

`pic` wird viel zu früh definiert. Das sollte kurz vor der for-Schleife passieren. Wenn eine Zeile `Date` enthalten kann, wird das Umwandeln in `int` fehlschlagen. if-Befehle brauchen keine Klammern, weg damit. `tabelle` wird nie definiert und die Zeile ist auch zu weit eingerückt. `temp` kann man sich sparen, weil line.split schon die gewünschte Liste liefert.
Samoth
User
Beiträge: 41
Registriert: Freitag 24. November 2017, 15:13

Donnerstag 14. Dezember 2017, 09:20

Hallo,
also mit Pandas hat das soweit geklappt.

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-
# read.py


import glob
import pandas
from os.path import join
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

ROOT = "/media/sf_PHD/AERONET_DATEN/"
fns = glob.glob(join(ROOT, "*.lev15"))[:31]
print(fns[:2])

temp=pandas.read_csv(fns[1], delimiter=',', header=4)
#month = pandas.date_range('2017-04-30', '2017-07-31', freq="M")

temp['Time(hh:mm:ss)'] = pd.to_datetime(temp['Time(hh:mm:ss)'])
temp['Date(dd-mm-yy)'] = pd.to_datetime(temp['Date(dd-mm-yy)'],format='%d:%m:%Y')

#time_temp=pandas.to_datetime(temp['Date(dd-mm-yy)'] + ' ' + temp['Time(hh:mm:ss)'])

timestring = timestring.to_datetime(time_temp, format='%d/%m/%Y %H:%M:%S')

x = timestring
y = temp['AOT_1640']

# plot
plt.plot(temp['Date(dd-mm-yy)',y)
# beautify the x-labels
plt.gcf().autofmt_xdate()

plt.show()
Habe da nun aber nochmals eine Frage.

Ich habe diese Spalten:

Code: Alles auswählen

In [93]: temp.dtypes
Out[93]: 
Date(dd-mm-yy)                      datetime64[ns]
Time(hh:mm:ss)                      datetime64[ns]
Julian_Day                                 float64
AOT_1640                                   float64
AOT_1020                                   float64
Nun möchte ich zum einen Datum und Zeit zusammenführen und dann über die AOT_ plotten.
Füge ich die beiden datetimes zusammen, erhalte ich

Code: Alles auswählen

AttributeError: 'Series' object has no attribute 'to_datetime'
was mache ich da falsch?

Gruß und danke
Samoth
User
Beiträge: 41
Registriert: Freitag 24. November 2017, 15:13

Donnerstag 14. Dezember 2017, 13:42

OK.. geschafft..
letztest Problem, die x Achse lässt sich nicht plotten...


plt.plot(x,y1,'r--')
ValueError: could not convert string to float: '31:05:2017'

wobei x die Zeit darstellt
Out[61]:
0 2017-12-14 14:03:19
1 2017-12-14 09:18:20
2 2017-12-14 14:48:13
3 2017-12-14 06:10:50
4 2017-12-14 06:48:05
Antworten