高(而非圆)频率DatetimeIndex

时间:2018-01-19 15:35:56

标签: python pandas signal-processing

虽然大熊猫处理低频信号非常好(例如大约一天/秒),但我发现管理高频信号或/和非圆频信号总是比较困难。

想象一下,想要创建频率为300Hz且持续时间为1秒的DatetimeIndex。问题是300赫兹的频率导致步长为0.00333333333,无限小数。解决方案可以是使用具有最高分辨率(纳秒)的date_range函数:

pd.date_range(start=0, periods=300, freq='3333333ns') # start on UNIX epoch because I do not care

结果是:

DatetimeIndex([          '1970-01-01 00:00:00',
               '1970-01-01 00:00:00.003333333',
               '1970-01-01 00:00:00.006666666',
               '1970-01-01 00:00:00.009999999',
               ...
               '1970-01-01 00:00:00.989999901',
               '1970-01-01 00:00:00.993333234',
               '1970-01-01 00:00:00.996666567'],
              dtype='datetime64[ns]', length=300, freq='3333333N')

正如您所看到的,与预期结果相比,最后一个样本已经延迟:

1 - 0.003333333 = 0.9966666666

我发现这个问题的解决方案是:

def date_range_fs(duration, fs, start=0):
    """ Create a DatetimeIndex based on sampling frequency and duration
    Args:
        duration: number of seconds contained in the DatetimeIndex
        fs: sampling frequency
        start: Timestamp at which de DatetimeIndex starts (defaults to POSIX
               epoch)
    Returns: the corresponding DatetimeIndex
    """
    return pd.to_datetime(
        np.linspace(0, 1e9*duration, num=fs*duration, endpoint=False),
        unit='ns',
        origin=start)

预期结果:

> date_range_fs(1, 300)
DatetimeIndex([          '1970-01-01 00:00:00',
               '1970-01-01 00:00:00.003333333',
               '1970-01-01 00:00:00.006666666',
                  '1970-01-01 00:00:00.010000',
               ...
                  '1970-01-01 00:00:00.990000',
               '1970-01-01 00:00:00.993333333',
               '1970-01-01 00:00:00.996666666'],
              dtype='datetime64[ns]', length=300, freq=None)

但是这个解决方案并不理想,因为它返回的DatetimeIndex没有频率(freq=None),因此无法利用所有pandas功能,例如转换为PeriodIndex

我的问题如下:他们无论如何都要获得相同的结果,但是使用完全定义的DatetimeIndex(即...... freq不是None)?

我正在考虑开发自己的DateOffset,但这似乎很复杂,但我没有这样做。无论如何,拥有Hz偏移别名以便能够写freq='300Hz'会很棒。

注意提到类似的问题here但是接受的解决方案看起来很复杂而且没有集成到pandas中(而且我的也没有)。

0 个答案:

没有答案