我一直在编写一个使用在特定频率下采样的pandas数据帧的类。它用来指定这些频率的参数是大熊猫中常用的frequency strings(例如'H','15min','D')
我的一种方法需要将这些频率相互比较 - 其中一个频率适合另一个频率。有一个聪明,直接的方法来做到这一点?我写了以下内容,但它看起来很笨重和间接:
def _get_relative_timediff(self, freq1, freq2):
""" Returns how many (based on seconds) of frequency 2 goes into frequency 1
"""
old = pd.period_range(start='1/1/1900', freq=freq1, periods=2)[1].to_timestamp()
new = pd.period_range(start='1/1/1900', freq=freq2, periods=2)[1].to_timestamp()
old = (old - pd.to_datetime('1/1/1900')).seconds
new = (new - pd.to_datetime('1/1/1900')).seconds
relative = float(old/new)
return relative
有效:
my_object._get_relative_timediff('8H', 'min')
480.0
但我必须想象有更好的方式(或应该是)。谢谢!
答案 0 :(得分:2)
rmarkdown
可用于将str转换为时间段。这是一个例子:
pd.to_timedelta
你得到:
import pandas as pd
import re
def to_timedelta(freq):
# Add '1' to freq that doesn't have any digit
if not bool(re.search(r'\d', freq)):
freq = '1{}'.format(freq)
# Convert str to datetime.timedelta
return pd.to_timedelta(freq)
def get_relative_timediff(freq1, freq2):
return to_timedelta(freq1) / to_timedelta(freq2)
print get_relative_timediff('8H', 'min')
print get_relative_timediff('4D', '8H')
注意我必须手动添加' 1'没有任何数字的频率。