2015-07-13 67 views
1

我試圖用5120 Hz的採樣頻率生成pandas.DateTimeIndex。這給出了increment=0.0001953125秒的時間段。pandas.date_range精確頻率參數

如果您嘗試使用pandas.date_range(),則需要將頻率(參數freq)指定爲strpandas.DateOffset。第一個只能處理高達1 ns的精度,後者與str相比性能可怕,甚至出現更糟糕的錯誤。

當使用串,我構造如下:

freq=str(int(increment*1e9))+'N') 

其中後3萬條記錄的關於執行在小於2秒我的270 MB的文件,但是我有一個錯誤(在DateTimeIndex) 1500μs。

當使用pandas.DateOffset,像這樣

freq=pd.DateOffset(seconds=increment) 

它分析在1分鐘內14秒的文件,但具有大約的第二個的錯誤。

我也嘗試過使用

starttime + pd.to_timedelta(cumulativeTimes, unit='s') 

這筆款項還需要年齡完成構建DateTimeIndex,但不具有錯誤的產生DateTimeIndex唯一的一個。

如何才能實現DateTimeIndex的高性能生成,保持我的準確性?

+0

如果在熊貓中似乎存在錯誤,您可以在https://github.com/pydata/pandas/issues中打開關於它的問題嗎? – joris

+0

@joris我以爲在熊貓有一個bug,但我不這麼認爲。熊貓的準確度只有1納秒,其他因素都是舍入誤差造成的。 – rubdos

回答

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上拉請求感興趣:https://github.com/adamreeve/npTDMS/pull/31

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)