从 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.days
和 td.seconds
,它们分别告诉你天数和秒数的差异。也就是说2天15秒对应的timedelta
会有td.days = 2
和td.seconds = 15
。
下面的代码将构造一个格式为“XXXDYYYS”的字符串,然后将其传递给to_offset
。这样做的缺点是当你打印它时,它看起来不那么漂亮,即它不会说<Hour>
,它会说<3600 seconds>
。但我认为你可以忍受。
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函数将时间列所有时间数据处理到当周的周五(星期五)