pandas 打印Timedelta到纳秒精度

33qvvth1  于 2023-03-16  发布在  其他
关注(0)|答案(4)|浏览(121)

如何直接打印精确到纳秒的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

您可以看到,Timestamp最多打印到纳秒,而Timedelta仅打印到微秒。
非常感谢您的帮助!

kwvwclae

kwvwclae1#

pd.Timedelta.componentsNamedTuple-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'
>>>

或者,正如您在源代码中看到的,_repr_base方法有一个可以使用的format参数。

>>> 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-like(无论这意味着什么-它是否保证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
>>>

这可能是偏执狂,但我找不到任何信息沿着这方面的线索。也许有人会插话。

q3aa0525

q3aa05252#

也许纳秒只是没有打印出来,但它们就在那里:

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
x33g5p2x

x33g5p2x3#

您可以通过named tuple like object访问所需的属性:

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

klsxnrf14#

如果您是panda1.5.0之前的版本,并且不介意这个版本被弃用,那么您可以访问td.delta来获取以纳秒https://pandas.pydata.org/docs/reference/api/pandas.Timedelta.delta.html为单位的时间

相关问题