虽然大熊猫处理低频信号非常好(例如大约一天/秒),但我发现管理高频信号或/和非圆频信号总是比较困难。
想象一下,想要创建频率为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中(而且我的也没有)。