2015-10-15 118 views
3

我正在嘗試使用熊貓數據框分析數星期內測量「X」的平均每日波動,但是時間戳/日期時間等被證明是特別地獄般的處理。花了好幾個小時試圖解決這個問題,我的代碼變得越來越混亂,我認爲我沒有更接近解決方案,希望這裏的某個人能夠指引我朝着正確的方向前進。用熊貓分時數據框

我已測量的X在不同時間和在不同的日子,每天的結果保存到具有形式的數據幀:

Timestamp(datetime64)   X 

0 2015-10-05 00:01:38   1 
1 2015-10-05 06:03:39   4 
2 2015-10-05 13:42:39   3 
3 2015-10-05 22:15:39   2 

由於測量是在從每天我決定的變化作出的時間使用binning來組織數據,然後計算每個bin的平均值和STD,然後我可以繪製它們。我的想法是創建一個二進制位最終數據幀和X爲測量的平均值,該「意見」一欄只是爲了幫助理解:

 Time Bin  Observations  <X> 

0  00:00-05:59  [ 1 , ...]  2.3 
1  06:00-11:59  [ 4 , ...]  4.6 
2  12:00-17:59  [ 3 , ...]  8.5 
3  18:00-23:59  [ 2 , ...]  3.1 

但是我已經不兼容的時間之間遇到困難, datetime,datetime64,timedelta和binning使用pd.cut和pd.groupby,基本上我覺得我在黑暗中刺中,不知道「正確」的方式來解決這個問題。我能想到的唯一解決方案是通過數據框逐行迭代,但我真的很想避免必須這樣做。

回答

4

每當我將時間序列數據按時間範圍分組,這似乎是您在這裏所做的,我只需創建一個「每小時」列並對其進行切片。另外,我通常將索引設置爲日期時間值...雖然在這裏沒有必要。

# assuming your "timestamp" column is labeled ts: 
df['hod'] = [r.hour for r in df.ts] 

# now you can calculate stats for each bin 
ave = df[ (df.hod>=0) & (df.hod<6) ].mean() 

我認爲存在使用df.resample這裏的方法,但在時間序列的定義不清的開始/結束點,我認爲這可能需要比上述方法更多的關注。

這是沿着你想要的?

0

不知道我有最好的答案,但我認爲它可以正常工作。
首先,我會轉換datetime64datetime使用這個職位,例如: Converting between datetime, Timestamp and datetime64

然後,如果我們假設你的第一列具有datetime,被稱爲TimeStamp,我會做這樣的事情:

def bin_f(x): 
    if x.time() < datetime.time(6): 
     return "00:00-05:59" 
    elif x.time() < datetime.time(12): 
     return "06:00-11:59" 
    elif x.time() < datetime.time(18): 
     return "12:00-17:59" 
    else: 
     return "18:00-23:59" 

df["Bin"] = df["TimeStamp"].apply(bin_f) 
grouped = df.groupby("Bin") 
grouped['X'].agg(np.std) 

X是您列的名稱。

0

我發現我的目的Mathiou的反應有幫助的,但修改了它如下:

def bin_f(x): 
    h = x.time() 
    if h < 6: 
     return "00:00-05:59" 
    elif h < 12: 
     return "06:00-11:59" 
    elif h < 18: 
     return "12:00-17:59" 
    else: 
     return "18:00-23:59"