2016-11-01 56 views
1

我有一個簡單的時間序列重採樣時間序列,由datetime值驅動(即,它定期記錄的數據點),Series1與給定timedelta和分級或插

datetime,temp 
2015-05-28 17:00:00,24.199 
2015-05-28 17:15:00,24.465 
2015-05-28 17:30:00,24.392 
2015-05-28 17:45:00,25.094 
2015-05-28 18:00:00,25.239 
etc. 

和我試圖協調第二時間序列,其由一個事件驅動的(表示爲二進制值0和1),Series2

datetime,window 
2015-05-28 17:00:00,0.0 
2015-05-28 17:55:28,1.0 
2015-06-08 07:35:31,0.0 
2015-06-08 08:04:30,1.0 
2015-06-18 17:11:55,0.0 
2015-06-18 18:11:52,1.0 
2015-06-19 18:14:09,0.0 
etc. 

我想協調兩個,即表達事件驅動時間成小時(或小時)值。 我假設這可能需要創建一個Series2的日期時間索引,它可以匹配Series1的日期時間索引,並使用範圍爲[0,1]的值填充窗口列。這些值將來自某種'時間分組',其中計算每個區間花費的時間百分比(該區間由Series1中後續行之間的日期時間差定義)。

希望這是有道理的。

我一直在使用重採樣與不同的方法嘗試,即 series2_hr = series2.resample('H').bfill().mean.last嘗試,但這些都不給我所需的輸出。

我也曾嘗試插值:

series2_hr = series2.resample('H') 
series2_hr = series2_hr.interpolate(method='time') 

但同樣沒有運氣。

期望的輸出是窗口值在1的給定時間間隔(比如每小時)的百分比。換句話說,該小時的窗口的平均值(從0到1)。

實施例:由上採樣到一分鐘間隔,與原有的時間序列的條目向前填充

2015-05-28 17:00:00,0.916 (=(17:55 - 17:00)/60) 
2015-05-28 18:00:00,1 
2015-05-28 19:00:00,1 
... 
2015-06-08 07:00:00,0.583 (=(07:35 - 07:00)/60)) 
2015-06-08 08:00:00,0.06 (=(08:04 - 08:00)/60)) 
2015-06-08 09:00:00,1 
2015-06-08 10:00:00,1 
... 
+0

什麼是期望的輸出? –

回答

1
import io 
import pandas as pd 

data = io.StringIO('''\ 
datetime,window 
2015-05-28 17:00:00,0.0 
2015-05-28 17:55:28,1.0 
2015-06-08 07:35:31,0.0 
2015-06-08 08:04:30,1.0 
2015-06-18 17:11:55,0.0 
2015-06-18 18:11:52,1.0 
2015-06-19 18:14:09,0.0 
''') 

s = pd.read_csv(data).set_index('datetime').squeeze() 
s.index = pd.to_datetime(s.index) 

開始:系列2

datetime,window 
2015-05-28 17:00:00,0.0 
2015-05-28 17:55:28,1.0 
2015-06-08 07:35:31,0.0 
2015-06-08 08:04:30,1.0 
2015-06-18 17:11:55,0.0 
2015-06-18 18:11:52,1.0 
2015-06-19 18:14:09,0.0 
etc. 

應該被轉換爲series2_reg 。

upsampled = s.resample('min').ffill() 
upsampled['2015-06-08 07:30':'2015-06-08 08:10'] 

# datetime 
# 2015-06-08 07:30:00 1.0 
# 2015-06-08 07:31:00 1.0 
# 2015-06-08 07:32:00 1.0 
# 2015-06-08 07:33:00 1.0 
# 2015-06-08 07:34:00 1.0 
# 2015-06-08 07:35:00 1.0 
# 2015-06-08 07:36:00 0.0 
# 2015-06-08 07:37:00 0.0 
# 2015-06-08 07:38:00 0.0 
# 2015-06-08 07:39:00 0.0 
# 2015-06-08 07:40:00 0.0 
# 2015-06-08 07:41:00 0.0 
# 2015-06-08 07:42:00 0.0 
# 2015-06-08 07:43:00 0.0 
# 2015-06-08 07:44:00 0.0 
# 2015-06-08 07:45:00 0.0 
# 2015-06-08 07:46:00 0.0 
# 2015-06-08 07:47:00 0.0 
# 2015-06-08 07:48:00 0.0 
# 2015-06-08 07:49:00 0.0 
# 2015-06-08 07:50:00 0.0 
# 2015-06-08 07:51:00 0.0 
# 2015-06-08 07:52:00 0.0 
# 2015-06-08 07:53:00 0.0 
# 2015-06-08 07:54:00 0.0 
# 2015-06-08 07:55:00 0.0 
# 2015-06-08 07:56:00 0.0 
# 2015-06-08 07:57:00 0.0 
# 2015-06-08 07:58:00 0.0 
# 2015-06-08 07:59:00 0.0 
# 2015-06-08 08:00:00 0.0 
# 2015-06-08 08:01:00 0.0 
# 2015-06-08 08:02:00 0.0 
# 2015-06-08 08:03:00 0.0 
# 2015-06-08 08:04:00 0.0 
# 2015-06-08 08:05:00 1.0 
# 2015-06-08 08:06:00 1.0 
# 2015-06-08 08:07:00 1.0 
# 2015-06-08 08:08:00 1.0 
# 2015-06-08 08:09:00 1.0 
# 2015-06-08 08:10:00 1.0 
# Freq: T, Name: window , dtype: float64 

然後按小時重新取樣,取每個區間的平均值。

result = upsampled.resample('H').mean() 
result['2015-06-08 06:00':'2015-06-08 09:00'] 

# datetime 
# 2015-06-08 06:00:00 1.000000 
# 2015-06-08 07:00:00 0.600000 
# 2015-06-08 08:00:00 0.916667 
# 2015-06-08 09:00:00 1.000000 
# Freq: H, Name: window , dtype: float64 

請注意,上採樣將分配給具有該事件的值的事件的分鐘。如果您的事件數據代表打開和關閉,這意味着upsampled的每一分鐘在該時間段結束時都具有該開/關切換的狀態。這就是爲什麼我的數字完全不符合您的要求(另外,我相信您在2015-06-08 08:00:00的計算中有錯誤)。

由於您的事件精確到秒,因此您可以按秒而不是按分鐘進行上採樣,從而實現每小時平均值window的更精確的值。

upsampled = s.resample('s').ffill() 
result = upsampled.resample('H').mean() 
result['2015-06-08 06:00':'2015-06-08 09:00'] 

# datetime 
# 2015-06-08 06:00:00 1.000000 
# 2015-06-08 07:00:00 0.591944 
# 2015-06-08 08:00:00 0.925000 
# 2015-06-08 09:00:00 1.000000 
# Freq: H, Name: window , dtype: float64 
+0

謝謝,這工作正常! – Andreuccio