如何在数据帧中拆分给定时间范围内的时间?蟒



我有一个数据帧看起来像这样,

 **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 为第三个月。

是否可以像这样将结果作为数据帧返回?

    **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)

是的,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,这似乎是您正在使用的(。

我尝试了另一种方法来计算每月平均每天的学生人数,如下所示,

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

最新更新