如何在数据框中的给定时间范围内分割时间?蟒蛇

时间:2017-02-04 01:22:56

标签: python pandas

我的DataFrame看起来像这样,

 **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-06-18,时间间隔为30天,以计算平均学生人数。例如,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

我在下面使用的代码返回从1978-03-10开始的时间分割,我可以知道如何在DataFrame类型中返回结果,如上所示吗?

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)

2 个答案:

答案 0 :(得分: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,这似乎是您正在使用的类型。)

答案 1 :(得分:0)

我尝试了另一种方法来计算每月平均每月学生人数,

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