【问题标题】:Represent negative timedelta in most basic form以最基本的形式表示负时间增量
【发布时间】:2017-03-22 12:12:30
【问题描述】:

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

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

如何以-00:30 的形式取回此Timedelta 的(str) 表示形式?

我想显示这些增量并要求用户计算表达式 -1 day + something is a bit Award。

【问题讨论】:

  • 可以使用print (pd.Timedelta('-0.5h').total_seconds() / 60) 吗?
  • 更好地处理不同时间范围的东西会更好
  • 也许它更像是熊猫的python问题,检查this

标签: pandas timedelta python-datetime


【解决方案1】:

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

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

输出:

'30 minutes from now'

【讨论】:

  • 这将是一件有趣的事情,但是,“不久前”的比喻在这种情况下不起作用,因为它只是我所代表的偏移量。
【解决方案2】:

好吧,我会接受一个约会的黑客:

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

【讨论】:

    【解决方案3】:

    您可以使用 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


    这是一个完全的 hack,不适用于系列数据,但是....

    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
    

    【讨论】:

    • 但是“只是格式化”是相当多的工作,以防可能存在不同时间范围的增量。
    • 这是编程。让机器像人类一样“思考”确实是“相当艰巨的工作”。
    • 我希望有一些自动化的方式,让以前有人做过同样的事情。
    【解决方案4】:

    我正在寻找类似的东西(见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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 2016-12-22
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      相关资源
      最近更新 更多