我的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)
答案 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
这就是你想要的。
要注意两件事:
DataFrame
的索引。如果不是,您可以使用df.set_index("Date")
将其作为索引。datetime64[ns]
类型,或者是某种类型的广告(例如datetime
,这似乎是您正在使用的类型。)答案 1 :(得分:0)
我尝试了另一种方法来计算每月平均每月学生人数,
n_students_month = df.groupby([(df.index.year), (df.index.month)]).sum()/30