以最基本的形式表示负时间delta

时间:2017-03-22 12:12:30

标签: pandas timedelta python-datetime

如果我为例如创建否定Timedelta 0.5小时,内部表示如下:

In [2]: pd.Timedelta('-0.5h')
Out[2]: Timedelta('-1 days +23:30:00')

如何以str的形式取回此Timedelta的{​​{1}})代表?

我想显示这些增量,并要求用户计算表达式-1天+某些东西有点奖励。

4 个答案:

答案 0 :(得分:1)

我无法为您添加评论,因此请在此处添加评论。不知道这是否有帮助,但我认为你可以使用python humanize。

import humanize as hm
hm.naturaltime((pd.Timedelta('-0.5h')))

输出:

'30 minutes from now'

答案 1 :(得分:0)

好的,我会和一个黑客一起过日期:

sign = ''
date = pd.to_datetime('today')
if delta.total_seconds() < 0:
    sign = '-'
    date = date - delta
else:
    date = date + delta

print '{}{:%H:%M}'.format(sign, date.to_pydatetime())

答案 2 :(得分:0)

您可以使用Pandas timedelta的components

import pandas as pd
t = pd.Timedelta('-0.5h')
print t.components

>> Components(days=-1L, hours=23L, minutes=30L, seconds=0L, milliseconds=0L, microseconds=0L, nanoseconds=0L)

您可以使用

访问每个组件
print t.components.days
>> -1
print t.components.hours
>> 23
print t.components.minutes
>> 30

其余的就是格式化。

source

这是一个完全无法用于系列数据的黑客,但....

import pandas as pd
import numpy as np
t = pd.Timedelta('-0.5h').components
mins =  t.days*24*60 + t.hours*60 + t.minutes

print str(np.sign(mins))[0]+str(divmod(abs(mins), 60)[0]).zfill(2)+':'+str(divmod(abs(mins), 60)[1]).zfill(2)

>> -00:30

答案 3 :(得分:0)

我正在寻找类似的东西(见https://github.com/pandas-dev/pandas/issues/17232

我不确定它是否会在Pandas中实现,所以这是一个解决方法

import pandas as pd


def timedelta2str(td, display_plus=False, format=None):
    """

    Parameters
    ----------
    format : None|all|even_day|sub_day|long
    Returns
    -------
    converted : string of a Timedelta

    >>> td = pd.Timedelta('00:00:00.000')
    >>> timedelta2str(td)
    '0 days'

    >>> td = pd.Timedelta('00:01:29.123')
    >>> timedelta2str(td, display_plus=True, format='sub_day')
    '+ 00:01:29.123000'

    >>> td = pd.Timedelta('-00:01:29.123')
    >>> timedelta2str(td, display_plus=True, format='sub_day')
    '- 00:01:29.123000'

    """
    td_zero = pd.Timedelta(0)
    sign_sep = ' '
    if td >= td_zero:
        s = td._repr_base(format=format)
        if display_plus:
            s = "+" + sign_sep + s
        return s
    else:
        s = timedelta2str(-td, display_plus=False, format=format)
        s = "-" + sign_sep + s
        return s


if __name__ == "__main__":
    import doctest
    doctest.testmod()