Python Pandas频率字符串比较

时间:2017-02-15 21:07:21

标签: python pandas

我一直在编写一个使用在特定频率下采样的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

但我必须想象有更好的方式(或应该是)。谢谢!

1 个答案:

答案 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'没有任何数字的频率。