【问题标题】:Build a Pandas pd.tseries.offsets from timedelta从 timedelta 构建 Pandas pd.tseries.offsets
【发布时间】:2015-02-11 05:47:28
【问题描述】:

我想从 datetime.timedelta 构建一个 Pandas pd.tseries.offsets

In [1]: from pandas.tseries.frequencies import to_offset
In [2]: import datetime
In [3]: td = datetime.timedelta(hours=1)


In [4]: to_offset('1H')
Out [4]: <Hour>

In [5]: to_offset(td)
Out [5]: ValueError

任何(其他)想法?

【问题讨论】:

    标签: python datetime pandas timedelta


    【解决方案1】:

    to_offset 返回一个pd.DateOffset。所以你可以直接构建这个对象:

    >>> td = datetime.timedelta(hours=1)
    >>> pd.DateOffset(seconds=td.total_seconds())
    <DateOffset: kwds={'seconds': 3600.0}>
    
    >>> to_offset(pd.DateOffset(seconds=td.total_seconds()))
    <DateOffset: kwds={'seconds': 3600.0}>
    

    为了更好的字符串表示:

    >>> pd.DateOffset(days=td.days, 
                      hours=td.seconds // 3600, 
                      minutes=(td.seconds // 60) % 60)
    <DateOffset: kwds={'hours': 1, 'minutes': 0, 'days': 0}>
    

    【讨论】:

    • 更好的解决方案:)
    • 还是你提到的字符串表示不是那么漂亮。
    • github.com/pydata/pandas/issues/9064,我认为这可能是一个简单的改进
    • 字符串repr其实有点棘手,需要一个reduce offset函数
    【解决方案2】:

    这现在适用于 pandas 23.x。我找不到它是什么时候推出的。

    from pandas.tseries.frequencies import to_offset
    
    td = datetime.timedelta(hours=1)
    
    to_offset('1H')
    >>> <Hour>
    
    to_offset(td)
    >>> <Hour>
    

    【讨论】:

      【解决方案3】:

      这不能直接使用to_offset 函数来完成。

      但是,您可以将 datetime.timedelta 转换为适当的字符串,然后将其作为参数传递。

      datetime.timdeltas 有两个属性,td.daystd.seconds,它们分别告诉你天数和秒数的差异。也就是说2天15秒对应的timedelta会有td.days = 2td.seconds = 15

      下面的代码将构造一个格式为“XXXDYYYS”的字符串,然后将其传递给to_offset。这样做的缺点是当你打印它时,它看起来不那么漂亮,即它不会说&lt;Hour&gt;,它会说&lt;3600 seconds&gt;。但我认为你可以忍受。

      from pandas.tseries.frequencies import to_offset
      import datetime
      
      
      td = datetime.timedelta(days=4, hours=1, seconds=12)
      
      s = '{td.days}D{td.seconds}S'.format(td=td)
      print(s)
      # 4D3612S
      
      offset = to_offset(s)
      print(offset)
      # <349212 * Seconds>
      

      作为一个不错的小功能:

      def td_to_offset(td):
          return to_offset('{td.days}D{td.seconds}S'.format(td=td))
      

      【讨论】:

      • 你认为不存在没有字符串的解决方案吗?
      猜你喜欢
      • 1970-01-01
      • 2015-09-25
      • 2016-05-31
      • 2018-01-13
      • 2014-05-06
      • 2018-02-04
      • 2018-04-06
      • 2013-04-12
      相关资源
      最近更新 更多