¿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!
3 respuestas
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.
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)
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
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.