Seite 1 von 1

Format von 60 auf 100'ter Einheit

Verfasst: Donnerstag 18. Februar 2021, 21:47
von Omm
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)

Re: Format von 60 auf 100'ter Einheit

Verfasst: Donnerstag 18. Februar 2021, 22:30
von Sirius3
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.

Re: Format von 60 auf 100'ter Einheit

Verfasst: Freitag 19. Februar 2021, 00:26
von Omm
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.

Re: Format von 60 auf 100'ter Einheit

Verfasst: Freitag 19. Februar 2021, 07:23
von Omm
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('.', ',')))

Re: Format von 60 auf 100'ter Einheit

Verfasst: Freitag 19. Februar 2021, 12:07
von __blackjack__
@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(".", ","))

Re: Format von 60 auf 100'ter Einheit

Verfasst: Freitag 19. Februar 2021, 17:42
von Omm
@__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