我正在尝试生成一个样本频率为5120 Hz的pandas.DateTimeIndex
。这给出了increment=0.0001953125
秒的时间段。
如果您尝试使用pandas.date_range()
,则需要将频率(参数freq
)指定为str
或pandas.DateOffset
。第一个只能处理高达1 ns的精度,后者与str
相比具有可怕的性能,甚至更糟糕的错误。
使用字符串时,我构造如下:
freq=str(int(increment*1e9))+'N')
在不到2秒的时间内执行我的270 Mb文件,但在300万条约1500μs的记录之后,我有一个错误(在DateTimeIndex中)。
使用pandas.DateOffset
时,就像这样
freq=pd.DateOffset(seconds=increment)
它在1分14秒内解析文件,但错误大约是一秒钟。
我也尝试使用
构建DateTimeIndex
starttime + pd.to_timedelta(cumulativeTimes, unit='s')
这个总和也需要很长时间才能完成,但是唯一一个在结果DateTimeIndex
中没有错误。
如何实现DateTimeIndex
的高性能生成,保持我的准确性?
答案 0 :(得分:0)
我使用纯粹的numpy实现来解决这个问题:
accuracy = 'ns'
relativeTime = np.linspace(
offset,
offset + (periods - 1) * increment,
periods)
def unit_correction(u):
if u is 's':
return 1e0
elif u is 'ms':
return 1e3
elif u is 'us':
return 1e6
elif u is 'ns':
return 1e9
# Because numpy only knows ints as its date datatype,
# convert to accuracy.
return (np.datetime64(starttime)
+ (relativeTime*unit_correction(accuracy)).astype(
"timedelta64["+accuracy+"]"
)
)
(这是感兴趣的人的github pull请求:https://github.com/adamreeve/npTDMS/pull/31)
答案 1 :(得分:0)
我认为我使用下面的函数得到了类似的结果(虽然它只使用纳秒精度):
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)