這個問題與我先前提出的一個問題有些相關(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:00
和03:00
數據進行比較,因爲在其他時間,無論是id=2
或id=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=3
,date_time=2001-01-01, 04:00
,和我想/希望Pandas
有更優雅的方法。
爲什麼這些'2,2001-01-01,00:00,2.0,-99,-99'-99都可以嗎? – Boud
在這種情況下,我只關心'T'列是否有數據,忽略其他數據。 – Bart