2016-10-04 93 views
2

這個問題與我先前提出的一個問題有些相關(Remapping `numpy.array` with missing values),我在時間序列中缺少數據,而有人建議「使用熊貓!。所以在這裏我去...熊貓時間系列與缺失數據/​​記錄的比較

我正在處理大型數據集,基本上包括來自不同觀察點的時間序列,我希望統計比較網站。這些數據集相當混亂;大量缺失數據(例如用-99表示),缺少時間記錄(一個站可能有時間記錄,另一個站可能有時間記錄,另一個站沒有),我只想包括/比較數據,其中(1)所有站點都有某個變量的數據,或者(2)我想比較的兩個站點都有該變量的數據,而忽略其他站點(不)是否有數據。

拿這個小例子:

import pandas as pd 
from io import StringIO 

data = StringIO("""\ 
    1, 2001-01-01, 00:00, 1.0, 0.5, 1.0 
    1, 2001-01-01, 01:00, 1.1, 0.6, 2.0 
    1, 2001-01-01, 02:00, 1.2, 0.7, 3.0 
    1, 2001-01-01, 03:00, 1.3, 0.8, 4.0 

    2, 2001-01-01, 00:00, 2.0, -99, -99 
    2, 2001-01-01, 01:00, -99, 1.6, 2.0 
    2, 2001-01-01, 02:00, 2.2, 1.7, 3.0 
    2, 2001-01-01, 03:00, 2.3, 1.8, 4.0 

    3, 2001-01-01, 00:00, 3.0, 2.5, 1.0 
    3, 2001-01-01, 01:00, 3.1, 2.6, -99 
    3, 2001-01-01, 02:00, -99, -99, 3.0 
    3, 2001-01-01, 03:00, 3.3, 2.8, 4.0 
    3, 2001-01-01, 04:00, 3.4, 2.9, 5.0 
""") 

columns = ['id','date','time','T','Td','cc'] 
df = pd.read_table(data, header=None, names=columns, delimiter=',', na_values=-99, parse_dates=[['date','time']]) 

-99表示缺失值。我想比較來自不同地點(列id)的數據(列T,Td,cc),但如前所述,只有在任何兩個或所有id都有我感興趣的變量的數據(完全忽略是否其他列中的數據丟失)。

所以在這個例子中,如果所有的網站需要有數據,對比T只會導致從2001-01-01, 00:0003:00數據進行比較,因爲在其他時間,無論是id=2id=3缺少T,並且最後一次紀錄id=3在其他id中完全不存在。

我一直在玩這個好幾個小時了,但說實話,我真的不知道從哪裏開始。是否可以使用上面列出的尺寸n_sites x n_valid_values(本例爲3x2)提取numpy.array,然後我可以使用它進行進一步分析?

編輯作爲一個局部,但實際上(真的)醜陋的解決方案,這樣的事情似乎工作:

# Loop over all indexes where T is nan: 
for i in np.where(df['T'].isnull())[0]: 
    # For each of them, set records with the same date_time to nan 
    j = np.where(df['date_time'] == df['date_time'][i])[0] 
    df['T'][j] = np.nan 
# Drop all records where T is nan 
df2 = df.dropna(subset=['T']) 

# Group by the different stations: 
g = df2.groupby('id') 

# Get the arrays (could automate this based on the unique id's): 
v1 = g.get_group(1)['T'] 
v2 = g.get_group(2)['T'] 
v3 = g.get_group(3)['T'] 

但是,這仍然沒有下降的記錄id=3date_time=2001-01-01, 04:00,和我想/希望Pandas有更優雅的方法。

+0

爲什麼這些'2,2001-01-01,00:00,2.0,-99,-99'-99都可以嗎? – Boud

+0

在這種情況下,我只關心'T'列是否有數據,忽略其他數據。 – Bart

回答

0

一種方法(在此基礎上:https://stackoverflow.com/a/34985243/3581217答案),這似乎工作是創建一個Dataframe,其中來自不同網站的意見有不同的列,那麼dropna()subset設置爲所有列,或兩個網站我想要進行比較,這會刪除數據丟失的所有行。

import pandas as pd 
import numpy as np 
from io import StringIO 

data1 = StringIO("""\ 
    1, 2001-01-01, 00:00, 1.0 
    1, 2001-01-01, 01:00, 1.1 
    1, 2001-01-01, 02:00, 1.2 
    1, 2001-01-01, 03:00, 1.3 
""") 

data2 = StringIO("""\ 
    2, 2001-01-01, 00:00, 2.0 
    2, 2001-01-01, 01:00, -99 
    2, 2001-01-01, 02:00, 2.2 
    2, 2001-01-01, 03:00, 2.3 
""") 

data3 = StringIO("""\ 
    3, 2001-01-01, 00:00, 3.0 
    3, 2001-01-01, 01:00, 3.1 
    3, 2001-01-01, 02:00, -99 
    3, 2001-01-01, 03:00, 3.3 
    3, 2001-01-01, 04:00, 3.4 
""") 

columns = ['id','date','time','T1'] 
df1 = pd.read_table(data1, header=None, names=columns, delimiter=',', na_values=-99, parse_dates=[['date','time']]) 
columns = ['id','date','time','T2'] 
df2 = pd.read_table(data2, header=None, names=columns, delimiter=',', na_values=-99, parse_dates=[['date','time']]) 
columns = ['id','date','time','T3'] 
df3 = pd.read_table(data3, header=None, names=columns, delimiter=',', na_values=-99, parse_dates=[['date','time']]) 

df = pd.concat([df1,df2,df3]).groupby('date_time').max() 
df = df.dropna(subset=['T1','T2','T3']) 

產生的Dataframe的樣子:

In [232]: df 
Out[232]: 
         T1 T2 T3 id 
date_time        
2001-01-01 00:00:00 1.0 2.0 3.0 3 
2001-01-01 03:00:00 1.3 2.3 3.3 3 

如果我想比較只有兩個站點,在這種情況下T3,無視df.dropna(subset=['T1','T2'])結果:

In [234]: df 
Out[234]: 
         T1 T2 T3 id 
date_time        
2001-01-01 00:00:00 1.0 2.0 3.0 3 
2001-01-01 02:00:00 1.2 2.2 NaN 3 
2001-01-01 03:00:00 1.3 2.3 3.3 3 

這是要走的路?仍覺得有點不熊貓?