2017-08-16 95 views
1

我有一個很長的時間系列,開始於1963年,到2013年結束。然而,從1963年到2007年,它有一個小時採樣週期,而2007年採樣率變爲5分鐘。是否有可能在2007年之後重新採樣數據,以便整個時間系列每小時進行一次數據採樣?下面的數據片。使用熊貓的數據幀下采樣特定時期

yr, m, d, h, m, s, sl 
2007, 11, 30, 19, 0, 0, 2180 
2007, 11, 30, 20, 0, 0, 2310 
2007, 11, 30, 21, 0, 0, 2400 
2007, 11, 30, 22, 0, 0, 2400 
2007, 11, 30, 23, 0, 0, 2270 
2008, 1, 1, 0, 0, 0, 2210 
2008, 1, 1, 0, 5, 0, 2210 
2008, 1, 1, 0, 10, 0, 2210 
2008, 1, 1, 0, 15, 0, 2200 
2008, 1, 1, 0, 20, 0, 2200 
2008, 1, 1, 0, 25, 0, 2200 
2008, 1, 1, 0, 30, 0, 2200 
2008, 1, 1, 0, 35, 0, 2200 
2008, 1, 1, 0, 40, 0, 2200 
2008, 1, 1, 0, 45, 0, 2200 
2008, 1, 1, 0, 50, 0, 2200 
2008, 1, 1, 0, 55, 0, 2200 
2008, 1, 1, 1, 0, 0, 2190 
2008, 1, 1, 1, 5, 0, 2190 

謝謝!

回答

2

給你的數據幀正確列名

df.columns = 'year month day hour minute second sl'.split() 

解決方案

df.groupby(['year', 'month', 'day', 'hour'], as_index=False).first() 

    year month day hour minute second sl 
0 2007  11 30 19  0  0 2180 
1 2007  11 30 20  0  0 2310 
2 2007  11 30 21  0  0 2400 
3 2007  11 30 22  0  0 2400 
4 2007  11 30 23  0  0 2270 
5 2008  1 1  0  0  0 2210 
6 2008  1 1  1  0  0 2190 

選項2
下面是建立關閉列重命名的選項。我們將使用pd.to_datetime巧妙地獲取我們的日期,然後使用resample。但是,你有時間差距,將不得不解決空值並重新投射dtypes。

df.set_index(
    pd.to_datetime(df.drop('sl', 1)) 
).resample('H').first().dropna().astype(df.dtypes) 

        year month day hour minute second sl 
2007-11-30 19:00:00 2007  11 30 19  0  0 2180 
2007-11-30 20:00:00 2007  11 30 20  0  0 2310 
2007-11-30 21:00:00 2007  11 30 21  0  0 2400 
2007-11-30 22:00:00 2007  11 30 22  0  0 2400 
2007-11-30 23:00:00 2007  11 30 23  0  0 2270 
2008-01-01 00:00:00 2008  1 1  0  0  0 2210 
2008-01-01 01:00:00 2008  1 1  1  0  0 2190 
2

重命名分鐘柱爲方便起見:

df.columns = ['yr', 'm', 'd', 'h', 'M', 's', 'sl'] 

創建日期時間列:

from datetime import datetime as dt 
df['dt'] = df.apply(axis=1, func=lambda x: dt(x.yr, x.m, x.d, x.h, x.M, x.s)) 

重新取樣:

對於大熊貓< 0.19:

df = df.set_index('dt').resample('60T').reset_index('dt') 

對於熊貓> = 0.19:

df = df.resample('60T', on='dt') 
+0

如果你運行這個,你會發現你仍然需要處理來自空白和浮點數的零值。 – piRSquared

2

你最好首先附加日期時間列到您的數據幀:
df['datetime'] = pd.to_datetime(df[['yr', 'mnth', 'd', 'h', 'm', 's']])

但在此之前,你應該改名月份列:
df.rename(columns={ df.columns[1]: "mnth" })

然後,您將日期時間列設置爲數據幀索引:
data.set_index('datetime', inplace=True)

現在你可以在你的數據幀由prefereed採樣率適用重採樣方法:
df.resample('60T', on='datatime').mean()

在這裏,我用意思聚集。您可以根據您的需要使用其他方法。 參見Pandas document作爲參考。

+0

如果你運行這個,你會發現你仍然需要處理來自零位的空位和浮點數的空值。 – piRSquared