¿Cómo se puede imprimir directamente pandas Timedelta con precisión de nanosegundos? Por ahora, mi solución es agregar a Timedelta alguna fecha ficticia para poder hacerlo. Con suerte, hay una mejor solución.

import pandas as pd
time = pd.Timedelta(50400001747113)
print(time)
#     0 days 14:00:00.001747
print(pd.Timestamp('2019-10-02') + time)
# 2019-10-02 14:00:00.001747113

Puede ver que Timestamp se imprime en nanosegundos, mientras que Timedelta solo en microsegundos.

¡Muchas gracias por su ayuda!

0
S.V 4 oct. 2019 a las 17:27

3 respuestas

La mejor respuesta

pd.Timedelta.components es NamedTuple-like. Haga una cadena de formato y pase los Componentes como dict.

>>> t
Timedelta('0 days 14:00:00.001747')
>>> fmt = '{days:} days {hours:02}:{minutes:02}:{seconds:02}.{milliseconds:03}{microseconds:03}{nanoseconds:03}'
>>> fmt.format(**t.components._asdict())
'0 days 14:00:00.001747113'
>>> 

O como puede ver en la fuente, el método _repr_base tiene un parámetro de formato que puede usar.

>>> t._repr_base('all')
'0 days 14:00:00.001747113'

También puede subclasificar el Pandas.Timedelta y anular el método ` str .

class MyTD(pd.Timedelta):
    def __str__(self):
        return self._repr_base(format='all')

>>> t = MyTD(50400001747113)
>>> print(t)
0 days 14:00:00.001747113

Dado que el prefijo de subrayado único para _repr_base puede indicar que es un detalle de implementación que podría cambiar y que pd.Timedelta.components solo es NamedTuple -como (lo que sea que eso signifique - ¿garantiza una interfaz NamedTuple?) podría estar seguro y extraer los valores de .components y pasarlos a una cadena de formato.

import operator

>>> components = operator.attrgetter('days','hours','minutes','seconds','milliseconds','microseconds','nanoseconds')
>>> fmt = '{} days {:02}:{:02}:{:02}.{:03}{:03}{:03}'
>>> 
>>> t
Timedelta('0 days 14:00:00.001747')
>>> print(fmt.format(*components(t.components)))
0 days 14:00:00.001747113
>>>

Eso puede ser paranoico, pero no pude encontrar ninguna información en ese sentido. Quizás alguien intervenga.

1
wwii 4 oct. 2019 a las 16:04

Puede acceder a los atributos que desee a través de named tupla como objeto:

import pandas as pd
time = pd.Timedelta(50400001747113)
>>> time.components
Components(days=0, hours=14, minutes=0, seconds=0, milliseconds=1, microseconds=747, nanoseconds=113)
0
MyNameIsCaleb 4 oct. 2019 a las 14:44

Probablemente los nanosegundos simplemente no se imprimen, pero están allí:

time = pd.Timedelta(50400001747113, unit='ns')
attrs = 'days,seconds,microseconds,nanoseconds'.split(',')
values = [getattr(time, a) for a in attrs]
print(dict(zip(attrs, values)))

Huellas:

{'days': 0, 'seconds': 50400, 'microseconds': 1747, 'nanoseconds': 113}

Puede acceder fácilmente a nanosegundos a través del atributo:

>>> time.nanoseconds
113
1
Maurice Meyer 4 oct. 2019 a las 14:42
58238332