2017-02-04 34 views
0

我有一個數據幀看起來像這樣,如何在一個數據框的給定時間範圍內分割時間? Python的

**Date**  **School**  **Number of Students** 
1978-03-10  York_HS    258 
1978-03-23  York_HS    106 
1978-04-07  York_HS    523 
1978-04-12  York_HS    587 
1978-04-19  York_HS    265 
1978-05-01  York_HS    106 
1978-05-10  York_HS    201 
1978-06-18  York_HS    225 

我想從1978年3月10日與時間間隔爲30天拆分時間1978年6月18日,數平均學生數。例如,1978-03-10至1978-04-08(30天)爲第一個月,1978-04-09至1978-05-08爲第二個月,1978-05-09至1978-06-07爲第三個月月。

是否有可能像這樣返回結果作爲DataFrame?

**Date**  **School**  **Average Number of Students** 
    1978-04-08  York_HS     29.56 
    1978-05-08  York_HS     31.93 
    1978-06-07  York_HS     14.20 

I中使用的代碼返回一個時間分割從1978年3月10日開始,我可以知道如何在一個數據幀類型返回結果如上所示我?

from datetime import date, datetime, timedelta 

def period(begin, end, delta): 
    begin = begin 
    while begin < end: 
     yield begin 
     begin += delta 

for result in period(date(2014, 9, 19), date(2016, 12, 23), timedelta(days=30)): 
     print (result) 
+1

您必須更改爲'開始= begin',不'開始= start' –

+0

是這個問題熊貓嗎? –

+0

@HåkenLid是的,我用Python熊貓。 – Peggy

回答

3

是的,pandas使這個很簡單。使用

玩具例子:

>>> import pandas as pd 
>>> import numpy as np 
>>> p = pd.date_range('2012/01/01', '2012/03/01', freq='W') 
>>> datum = np.random.randint(100, 300, size=9) 
>>> df = pd.DataFrame({'n_students': datum}, index=p) 
>>> df 
<<< 
      n_students 
2012-01-01   138 
2012-01-08   293 
2012-01-15   166 
2012-01-22   105 
2012-01-29   151 
2012-02-05   167 
2012-02-12   265 
2012-02-19   113 
2012-02-26   110 

我們只是做:

>>> df.resample('M').mean() 
<<<    n_students 
    2012-01-31  170.60 
    2012-02-29  163.75 

這是你想要的。

有兩件事情需要注意的:

  1. 你的日期必須是你DataFrame的索引。如果他們不是,你可以使用df.set_index("Date")作爲索引。
  2. 您的日期必須是datetime64[ns]類型,或者轉換爲該類型的東西(例如datetime,這似乎是您正在使用的類型)。
+0

非常感謝!這很有幫助。 – Peggy

0

我嘗試另一種方式來計算每日平均每月的學生如下,

n_students_month = df.groupby([(df.index.year), (df.index.month)]).sum()/30 
相關問題