pandas.date_range准确的freq参数

时间:2015-07-13 10:15:02

标签: python python-3.x pandas

我正在尝试生成一个样本频率为5120 Hz的pandas.DateTimeIndex。这给出了increment=0.0001953125秒的时间段。

如果您尝试使用pandas.date_range(),则需要将频率(参数freq)指定为strpandas.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的高性能生成,保持我的准确性?

2 个答案:

答案 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)