Format von 60 auf 100'ter Einheit

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Omm
User
Beiträge: 90
Registriert: Samstag 7. April 2018, 14:05

Hallo zusammen
gibt es in pandas(dataframe) eine einfache Möglichkeit die Zeit (timedelta64[ns]) in eine 100 Einheit umzuwandeln?
Beispiel: 10.30 auf 10,50

Code: Alles auswählen

       	# Data Bereich setzen
       	mask = (data[self.DATUM_ZEIT] >= start_date) & (data[self.DATUM_ZEIT] <= end_date)
        data = data.loc[mask]        
        perweek = data.groupby(by=[data[self.DATUM_ZEIT].dt.strftime('%W'), self.KOSTENSTELL]).sum()
        perweek = perweek.reset_index()
        # Format auf 'h,m' anpassen
        perweek[self.DURATION] = perweek[self.DURATION].apply(lambda x: f'{x.components.hours:2d},'f'{x.components.minutes:2d}' if not pd.isnull(x) else '')
Jeden Eintrag durchlaufen und umwandeln ist die Alternative, jedoch denke ich, dass es eine bessere Lösung gibt also wie nachstehend.

Code: Alles auswählen

    def humanize_time(self, secs):
        secs = abs(secs)
        mins, secs = divmod(secs, 60)
        hours, mins = divmod(mins, 60)
        mins = mins / 3 * 5
        return '%2d,%02d' % (hours, mins)
Sirius3
User
Beiträge: 18357
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast schon eine Dezimalzeit, und zwar Nanosekunden.
Wenn Du also Nanosekunden in Stunden umrechnen willst, mußt Du die Spalte nur in float umwandeln und durch 3.6e12 teilen.
Omm
User
Beiträge: 90
Registriert: Samstag 7. April 2018, 14:05

eigentlich simpel, wenn man den Durchblick hat.
Vielen Dank

Code: Alles auswählen

perweek[self.DURATION] = (perweek[self.DURATION].dt.total_seconds() / 3600).map('{:,.2f}'.format)
 
Kannst du mir bitte sagen, wie den Punkt durch das Komma ersetzen kann.
So wie ich das machen würde geht es nicht.
Omm
User
Beiträge: 90
Registriert: Samstag 7. April 2018, 14:05

ich habe es nun wie nachstehend gelöst. Dies ist sicherlich nicht die beste Lösung.

Code: Alles auswählen

perweek[self.DURATION] = (perweek[self.DURATION].dt.total_seconds() / 3600).map('{:.2f}'.format).map(lambda x: str(x.replace('.', ',')))
Benutzeravatar
__blackjack__
User
Beiträge: 14296
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Omm: Der `str()`-Aufruf ist überflüssig, denn `format()` liefert ja bereits eine Zeichenkette, und man könnte das natürlich auch in *einem* Aufruf erledigen.

Code: Alles auswählen

        perweek[self.DURATION] = (
            perweek[self.DURATION].dt.total_seconds() / 3600
        ).apply(lambda x: format(x, "{:.2f}").replace(".", ","))
„Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.“ — Brian W. Kernighan
Omm
User
Beiträge: 90
Registriert: Samstag 7. April 2018, 14:05

@__blackjack__ Vielen Danke für deine HIlfe
ich habe deinen Vorschlag reingemacht. Bei mir erscheint eine Fehlermeldung. 'ValueError: Invalid format specifier'
Wie nachstehend klappt es. Keine Ahnung was f' macht, format(), also dein Beispiel, kann ich nachvollziehen.

Code: Alles auswählen

perweek[self.DURATION] = (perweek[self.DURATION].dt.total_seconds() / 3600).apply(lambda x: f'{x:.2f}'.replace('.', ','))
Vielen Dank
Antworten