我有一个数据帧看起来像这样,
**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
这就是你想要的。
需要注意的两件事:
- 您的日期必须是您
DataFrame
的索引。如果不是,您可以使用df.set_index("Date")
将它们设为索引。 - 您的日期必须是
datetime64[ns]
类型,或者转换为该类型的内容(例如datetime
,这似乎是您正在使用的(。
我尝试了另一种方法来计算每月平均每天的学生人数,如下所示,
n_students_month = df.groupby([(df.index.year), (df.index.month)]).sum()/30