Seite 1 von 1

Finden des letzten Tags des Monats in einer Liste

Verfasst: Freitag 15. Juni 2018, 14:45
von Samoth
Hallo,
ich möchte gerne aus einer Liste den Index vom letzten Tag jeden Monats auslesen.

Leider bekomme ich bei meinen versuchen folgenden Fehler:

Code: Alles auswählen

AttributeError: 'RangeIndex' object has no attribute 'month'
Angefangen habe ich so:

Code: Alles auswählen

temp=pandas.read_csv(filename, delimiter=',')
dates=pandas.to_datetime(temp['Var1'])
Daraus bekomme ich eine Liste:

Code: Alles auswählen

0      2017-01-01 06:00:00
1      2017-01-01 07:00:00
2      2017-01-01 08:00:00
...

Name: Var1, Length: 4053, dtype: datetime64[ns]
Mit Hilfe des Befehls

Code: Alles auswählen

dates[dates.groupby(dates.index.month).apply(lambda s: np.max(s.index))].tolist()
sollte ich den letzten Index jedes Monats bekommen.

Kann mir da jemand weiterhelfen?

Gruß

Re: Finden des letzten Tags des Monats in einer Liste

Verfasst: Dienstag 19. Juni 2018, 17:52
von DeaD_EyE
Ich kenne mich mit Pandas nicht aus. Mit Python schon.
Meine Vermutung ist, dass es mit Pandas noch viel einfacher sein könnte.

Mal angenommen du hast eine Liste mit datetime objekten.
Um ein paar zufällige Daten zu generieren, hab ich eine kleine Funktion geschrieben.

Code: Alles auswählen

import random
import datetime


def get_rnd_date():
    while True:
        year = 2018
        month = random.randint(1, 12)
        day = random.randint(1,31)
        try:
            date = datetime.datetime(year, month, day)
        except ValueError:
            continue
        else:
            return date

dates = [get_rnd_date() for _ in range(100)]
Nun hast du Beispieldaten in dates, unsortiert.

Um mit itertools.groupby zu arbeiten, muss die Liste zuerst sortiert werden.
Dann kann man nach 'month' gruppieren.
So wie die sorted Funktion, hat auch groupby ein Argument für key.
Der key gibt an, nach was sortiert, bzw. gruppiert werden soll.

Um lambda zu vermeiden, kann man operator verwenden.
Der attrgetter ist genau das was du brauchst, um auf Attribute der Klassen zuzugreifen.
Die Funktion liefert eine Funktion zurück, die als Argument das Objekt erwartet, auf dessen Attribut zugegriffen werden soll.

Code: Alles auswählen

from itertools import groupby
from operator import attrgetter


sorted_dates = sorted(dates)
grouped_dates = groupby(sorted_dates, key=attrgetter('month'))
Nun kannst du die Ergebnisse ausgeben:

Code: Alles auswählen

for month, grouped in grouped_dates:
    last_day = list(grouped)[-1]
    # oder alternativ argument unpacking
    # *_, last = grouped
    print('Month:', month, 'last_date', last_day)
Nicht vergessen, dass nach dieser for-Schleife grouped aufgebraucht ist.
Der Trick dabei ist, das gruppierte mit list zu "konsumieren" um dann daraus das letzte Element auszugeben.
Da die Liste immer noch sortiert ist, braucht man das nicht noch einmal zu tun.