2017-02-04 7 views
0

私は平均的な学生の数をカウントするため、30日と時間間隔で1978年6月18日に1978年3月10日からの時間を分割したい、データフレームは、次のようになりますデータフレーム内の所定の時間範囲で時間を分割するにはどうすればよいですか? 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-03-10〜1978-04-08(30日)、2番目の月は1978-04-09〜1978-05-08、3番目の月は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 

私は以下の使用したコードは分割は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

を次のように月あたりの生徒の一日平均数を計算するための別の方法を試してみました、ではない'始まる= 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 

何をしたいです。注意すべき

2つのこと:

  1. あなたの日付があなたのDataFrameのインデックスでなければなりません。そうでない場合は、df.set_index("Date")を使用してインデックスにすることができます。
  2. 日付は、datetime64[ns]タイプ、またはそのタイプにキャストされるもの(datetimeなど)を使用する必要があります。
+0

ありがとう!それは役に立ちます。 – Peggy

0

は、私はあなたが `= begin`開始に変更する必要があり、

n_students_month = df.groupby([(df.index.year), (df.index.month)]).sum()/30 
関連する問題