从 timedelta 构建 Pandas pd.tseries.offsets

Posted

技术标签:

【中文标题】从 timedelta 构建 Pandas pd.tseries.offsets【英文标题】:Build a Pandas pd.tseries.offsets from timedelta 【发布时间】: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

任何(其他)想法?

【问题讨论】:

【参考方案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.daysDtd.secondsS'.format(td=td)
print(s)
# 4D3612S

offset = to_offset(s)
print(offset)
# <349212 * Seconds>

作为一个不错的小功能:

def td_to_offset(td):
    return to_offset('td.daysDtd.secondsS'.format(td=td))

【讨论】:

你认为不存在没有字符串的解决方案吗?

以上是关于从 timedelta 构建 Pandas pd.tseries.offsets的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用pd.to_timedelta函数将时间列所有时间数据处理到当周的周一(星期一Monday)使用value_counts函数统计不同周一星期一样本的个数

pandas通过DatetimeProperties对象获取日期对象的星期几周几信息编码(周一为0,周天为6)使用pd.to_timedelta函数将时间列所有时间数据处理到当周的周三(星期三)

pandas通过DatetimeProperties对象获取日期对象的星期几周几信息编码(周一为0,周天为6)使用pd.to_timedelta函数将时间列所有时间数据处理到当周的周二(星期二)

pandas通过DatetimeProperties对象获取日期对象的星期几周几信息编码(周一为0,周天为6)使用pd.to_timedelta函数将时间列所有时间数据处理到当周的周六(星期六)

pandas通过DatetimeProperties对象获取日期对象的星期几周几信息编码(周一为0,周天为6)使用pd.to_timedelta函数将时间列所有时间数据处理到当周的周四(星期四)

pandas通过DatetimeProperties对象获取日期对象的星期几周几信息编码(周一为0,周天为6)使用pd.to_timedelta函数将时间列所有时间数据处理到当周的周五(星期五)