2013-07-08 47 views
1

我是熊貓新手,我很想弄清楚如何將我的數據轉換爲時間序列對象。我有傳感器數據,其中有一個參考實驗開始的相對時間索引。這不是日期/時間格式。我在網上找到的所有文件均以某種過時的數據開始。我的一小段數據如下所示:大熊貓時間序列相對時間

0.000000 49.431958 4.119330 -0.001366 -9.483122E-9 
0.025000 49.501745 4.125145 0.004710 2.322330E-8 
0.050000 49.479531 4.123294 0.013725 1.185336E-7 
0.075000 49.492309 4.124359 0.006082 1.607667E-7 
0.325000 49.515702 4.126309 0.024307 9.750522E-7 
2.925000 49.437069 4.119756 0.000202 9.148022E-6 
3.025000 49.521010 4.126751 0.014313 9.590506E-6 
3.425000 49.510001 4.125833 -0.003913 1.075210E-5 

時間數據位於第一列。我試圖加載數據:

datalabels= ['time', 'voltage pack', 'av. cell voltage', 'current', 'charge count', 'soc', 'energy', 'unknown1', 'unknown2', 'unknown3'] 
datalvm= pd.read_csv(dpath+dfile, header=None, skiprows=25, names=datalabels, delimiter='\t', parse_dates={'Timestamp':['time']}, index_col='Timestamp') 

但我只是得到一個索引系列,而不是時間序列。

任何幫助將不勝感激。

乾杯!

+0

一旦閱讀完畢,您想怎麼做? – Jeff

+0

我希望能夠將其作爲預測預處理的一部分進行重新採樣。謝謝! – whitediver

回答

3

您應該通過解析dateTime對象的時間戳來構造熊貓TimeSeries對象。這就要求你挑選一些任意起始點

start = dt.datetime(year=2000,month=1,day=1) 
time = datalvm['time'][1:] 
floatseconds = map(float,time) #str->float 

#floats to datetime objects -> this is you timeseries index 
datetimes = map(lambda x:dt.timedelta(seconds=x)+start,floatseconds) 

#construct the time series 
timeseries = dict() #timeseries are collected in a dictionary 
for signal in datalabels[1:]: 
    data =map(float,datalvm[signal][1:].values) 
    t_s = pd.Series(data,index=datetimes,name=signal) 
    timeseries[signal] = t_s 

#convert timeseries dict to dataframe 
dataframe = pd.DataFrame(timeseries) 

您已經構造可以使用二次採樣函數的時間序列後:

dataframe['soc'].resample('1sec') 
+0

謝謝博,這正是我需要的! – whitediver

1

你可以做它的GROUPBY使用cut(你可以,如果你想指定的垃圾箱),或但是你想GROUPBY,使用上面的數據(這就是爲什麼我通過StringIO讀)

In [22]: df= pd.read_csv(StringIO(data), header=None, delimiter='\s+') 

In [23]: df.columns = ['time','col1','col2','col3','col4'] 

In [24]: df 
Out[24]: 
    time  col1  col2  col3   col4 
0 0.000 49.431958 4.119330 -0.001366 -9.483122e-09 
1 0.025 49.501745 4.125145 0.004710 2.322330e-08 
2 0.050 49.479531 4.123294 0.013725 1.185336e-07 
3 0.075 49.492309 4.124359 0.006082 1.607667e-07 
4 0.325 49.515702 4.126309 0.024307 9.750522e-07 
5 2.925 49.437069 4.119756 0.000202 9.148022e-06 
6 3.025 49.521010 4.126751 0.014313 9.590506e-06 
7 3.425 49.510001 4.125833 -0.003913 1.075210e-05 

In [25]: df.groupby(pd.cut(df['time'],2)).sum() 
Out[25]: 
        time  col1  col2  col3  col4 
time                
(-0.00343, 1.712] 0.475 247.421245 20.618437 0.047458 0.000001 
(1.712, 3.425]  9.375 148.468080 12.372340 0.010602 0.000029 
+0

什麼是-0.00343(啊我看到了,不使用right = False的後果),pd.cut非常整潔 –

+0

yeh ....''cut''在這裏很有意思,可以指定你自己的bin(這是請問你想做什麼);比實際指定groupby映射容易,但也可以做到這一點 – Jeff

+0

謝謝傑夫!這顯然是重新抽樣我的數據,但我不確定他們是否實際上是時間序列對象。我需要將它與需要大熊貓時間序列的代碼連接起來。 – whitediver

1

博的方法效果不錯,但我想避免使用任意的起點。我通常使用TimedeltaIndex來創建一個時間序列,以便我只能考慮從t0開始的時間差異。

time = datalvm['time'][1:] 
floatseconds = map(float,time) #str->float 
datalvm.index=pd.to_timedelta(floatseconds,unit='s')