печать Timedelta с точностью до наносекунды - PullRequest
0 голосов
/ 04 октября 2019

Как можно печатать непосредственно панды Timedelta с точностью до наносекунды? На данный момент мое решение состоит в том, чтобы добавить в Timedelta некоторую фиктивную дату, чтобы иметь возможность сделать это. Надеемся, что есть лучшее решение.

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

Вы можете видеть, что отметка времени печатается с точностью до наносекунд, а отметка времени - только с микросекундами.

Большое спасибо за вашу помощь!

Ответы [ 3 ]

1 голос
/ 04 октября 2019

pd.Timedelta.components - это NamedTuple-like. Создайте форматную строку и передайте Компоненты как диктовку.

>>> 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'
>>> 

Или, как вы можете видеть в source , метод _repr_baseимеет параметр формата, который вы можете использовать.

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

Вы также можете создать подкласс Pandas.Timedelta и переопределить метод ` 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

Учитывая, что один префикс подчеркивания для _repr_base может указывать на то, что это деталь реализации, которая может измениться и только pd.Timedelta.components NamedTuple -подобна (что бы это ни значило - гарантирует ли этоинтерфейс NamedTuple?) вы можете быть в безопасности и извлечь значения из .components и передать их в строку формата.

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
>>>

Это может быть параноиком, но я не смог найти никакой информации по этим строкам,Может быть, кто-то вмешается.

1 голос
/ 04 октября 2019

Возможно, наносекунды просто не печатаются, но они есть:

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)))

Отпечатки:

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

Вы можете легко получить доступ к наносекундам через атрибут:

>>> time.nanoseconds
113
0 голосов
/ 04 октября 2019

Вы можете получить доступ к нужным атрибутам через именованный кортеж как объект :

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)
...