【问题标题】:Create pandas freq string from floating point seconds从浮点秒创建熊猫频率字符串
【发布时间】:2021-09-28 05:26:32
【问题描述】:

我想在 pandas 中创建一系列日期,例如:

d = pd.date_range('2014-02-03 00:00:00','2014-02-03 01:00:00', freq=freq)

其中freq 是以秒为单位的数字。如果freq 是一个整数,那么:

d = pd.date_range('2014-02-03 00:00:00','2014-02-03 01:00:00', freq=f"{freq}s")

有效。如果它是浮点数,那么原则上可以使用偏移别名的某种组合(例如,“60S100L”持续 60.1 秒)。 有没有办法从浮点频率自动生成正确的偏移别名字符串?

例如,当频率等于 60.1 秒时,我想知道是否有内置方法将浮点数 60.1 转换为 '60S100L' 以获得:

pd.date_range('2014-02-03 00:00:00','2014-02-03 0:03:00', freq='60s100L')

产生:

DatetimeIndex([       '2014-02-03 00:00:00', '2014-02-03 00:01:00.100000',
               '2014-02-03 00:02:00.200000'],
              dtype='datetime64[ns]', freq='60100L')

【问题讨论】:

    标签: python pandas time-series


    【解决方案1】:

    您可以编写自己的函数来包装pd.date_range 并像这样处理浮点/整数转换:

    def custom_daterange(start, stop, freq):
        # handle floats that can be ints (e.g. 60.0, 61.0)
        if freq == int(freq):
            freq = int(freq)
    
        if isinstance(freq, int):
            freq_str = f"{freq}s"
    
        elif isinstance(freq, float):
            freq_base = int(freq)
            freq_remainder = freq - freq_base
            freq_str = f"{freq_base}s{freq_remainder * 1000:.0f}L"
    
        else:
            raise ValueError("freq MUST be either int or float")
        return pd.date_range(start, stop, freq=freq_str)
    

    那么你可以这样使用它:

    >>> custom_daterange('2014-02-03 00:00:00','2014-02-03 01:00:00', freq=60)
    DatetimeIndex([
        '2014-02-03 00:00:00', 
        '2014-02-03 00:01:00',
        ...
        '2014-02-03 00:59:00',
        '2014-02-03 01:00:00'],
        dtype='datetime64[ns]', freq='60S'
    )
    
    >>> custom_daterange('2014-02-03 00:00:00','2014-02-03 01:00:00', freq=60.1)
    DatetimeIndex([
        '2014-02-03 00:00:00', 
        '2014-02-03 00:01:00.100000', 
        ...
        '2014-02-03 00:58:05.800000',
        '2014-02-03 00:59:05.900000'],
        dtype='datetime64[ns]', freq='60100L'
    )
    
    

    【讨论】:

    • 是的,但这仅限于整数毫秒,不是吗?
    • 假设我可以转换为纳秒并使用此方法进行更精细的控制...
    • 您可以,但也要注意浮点数的舍入行为与真正的小数不同,可能会导致问题。在几毫秒内,我绕过了这个问题,因为舍入错误通常不会影响这些较大的小数位,因为会去掉较小的(小数点后千分之一位)。
    【解决方案2】:

    它基于频率 - 参数

    import pandas as pd
    
    seconds = pd.date_range(start='1/1/2018', end='1/08/2018', freq = 'S')
    days = pd.date_range(start='1/1/2018', end='1/08/2018')
    weeks = pd.date_range(start='1/1/2018', end='1/08/2018', freq='w')
    monthsStart = pd.date_range(start='1/1/2018', end='1/08/2018', freq='MS')
    quarters = pd.date_range(start='1/1/2018', end='1/08/2018', freq='Q')
    

    【讨论】:

    • 不确定我是否理解这如何回答我的问题...
    • 你能提供 - 预期的输出吗?
    • pandas 中还有 - .asfreq 函数 - 可以使用例如:df.asfreq(freq='30S')。不确定它是否能解决您的问题。
    猜你喜欢
    • 2022-07-20
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 2021-12-24
    • 2020-10-01
    • 1970-01-01
    相关资源
    最近更新 更多