2013-06-19 159 views
3

我正在嘗試使用pandas將每日數據重新採樣爲每週數據。pandas重新採樣數據幀並將日期時間索引保留爲列

我使用了以下內容:

weekly_start_date =pd.Timestamp('01/05/2011') 
weekly_end_date =pd.Timestamp('05/28/2013') 

daily_data = daily_data[(daily_data["date"] >= weekly_start_date) & (daily_data["date"] <= weekly_end_date)]  

daily_data = daily_data.set_index('date',drop=False) 
weekly_data = daily_data.resample('7D',how=np.sum,closed='left',label='left') 

問題是weekly_data沒有日期列了。

我錯過了什麼?

感謝,

+0

你想要日期列在這裏有什麼?它已經通過總和重新採樣(每週),我認爲不再有日期是有意義的。你期望什麼? –

+0

@Andy我希望能得到本週的第一次約會,例如開始例如 – ybb

回答

1

只能通過數字列重新取樣:

In [11]: df = pd.DataFrame([[pd.Timestamp('1/1/2012'), 1, 'a', [1]], [pd.Timestamp('1/2/2012'), 2, 'b', [2]]], columns=['date', 'no', 'letter', 'li']) 

In [12]: df1 = df.set_index('date', drop=False) 

In [13]: df1 
Out[13]: 
          date no letter li 
date 
2012-01-01 2012-01-01 00:00:00 1  a [1] 
2012-01-02 2012-01-02 00:00:00 2  b [2] 

In [15]: df1.resample('M', how=np.sum) 
Out[15]: 
      no 
date 
2012-01-31 3 

我們可以看到它使用了D型,以確定它是否是數字:

In [16]: df1.no = df1.no.astype(object) 

In [17]: df1.resample('M', how=sum) 
Out[17]: 
      date no letter li 
date 
2012-01-31  0 0  0 0 

一個可怕的黑客對實際總結:

In [21]: rng = pd.date_range(weekly_start_date, weekly_end_date, freq='M') 

In [22]: g = df1.groupby(rng.asof) 

In [23]: g.apply(lambda t: t.apply(lambda x: x.sum(1))).unstack() 
Out[23]: 
          date no letter  li 
2011-12-31 2650838400000000000 3  ab [1, 2] 

的日期是劃時代納秒的總和...

(希望我做一些愚蠢的,並有一個更簡單的辦法!)

+0

你可以說如果你真的想要重新採樣間隔的日期的中位數 – Jeff

+0

@Jeff我正在思考,因爲我先寫了這是一個謊言:s –

+0

謝謝安迪。我的數據框中的所有值都是數字。重採樣在我的代碼中工作。但是我需要將日期作爲重新採樣的df中的一列。當我使用「7D」重新採樣時,我不明白。日期列被刪除 – ybb

4

如果我明白你的問題,它看起來像你正確地進行重採樣(Pandas docs on resampling here:http://pandas.pydata.org/pandas-docs/stable/timeseries.html)。

weekly_data = daily_data.resample('7D',how=np.sum,closed='left',label='left') 

如果唯一的問題是你想在一列中複製DateTimeIndex,你可以這樣做。

weekly_data['date'] = weekly_data.index.values 

道歉,如果我誤解了這個問題。 :)

相關問題