我有一个大熊猫时间序列数据框,每年约有20行,从2014年到2017年,我试图计算每两年的平均值。
例如:
以下是我用来创建DataFrame的代码:
import pandas as pd
infile = 'https://environment.data.gov.uk/bwq/downloadAPI/requestDownload?report=samples&bw=ukj2100-14950&to=2018-02-05&from=2014-05-01'
df = pd.read_csv(infile,compression='zip',usecols=['intestinalEnterococciCount','sampleTime'], parse_dates=['sampleTime'],infer_datetime_format=True,index_col=['sampleTime'],na_values=True)
以及DataFrame的一个示例:
intestinalEnterococciCount
sampleTime
2014-05-12 13:00:00 10
2014-05-21 12:27:00 10
2014-05-27 10:55:00 10
2014-06-06 12:19:00 10
2014-06-09 13:26:00 10
我想计算每两年的平均值。预期的答案是:
Period Mean
Jan 2014 - Dec 2015: 33.575
Jan 2015 - Dec 2016: 22.85
Jan 2016 - Dec 2017: 25.5
我知道我可以使用一个循环遍历两年期间的列表并以这种方式计算它,但我确信必须有一个更好的方法来实现这个使用Pandas。
我尝试使用.rolling
,但似乎给出了滚动均值,它逐行递增,而不是超过两年。
我可以成功地使用groupby(df.index.year).mean
来获得每年的平均值,但是如何计算每两年的平均值呢?
非常感谢任何帮助。
由于
答案 0 :(得分:1)
您可以使用groupby
和rolling
,确保记录计数和总和,以便将来计算均值,(您只需要使用{{1}将索引更改为所需内容})
s.index=[your index list]
更新
s=df.groupby(df.index.strftime('%Y')).intestinalEnterococciCount.agg(['sum','count'])
s=s.rolling(window=2).sum()
s['mean']=s['sum']/s['count']
s.dropna()
Out[564]:
sum count mean
2015 1343.0 40.0 33.575
2016 914.0 40.0 22.850
2017 765.0 30.0 25.500
答案 1 :(得分:0)
要获得标准偏差和几何平均值等其他汇总统计数据,这里有点像哈希的方式:
df_std = pd.DataFrame([df[str(y):str(y+2)].std() for y in df.index.year.unique()])
df_std.index = df.index.year.unique().sort_values()
df_std
intestinalEnterococciCount
sampleTime
2014 63.825528
2015 37.596271
2016 34.845224
2017 51.384066
from scipy.stats.mstats import gmean
df_gm = pd.DataFrame([df[str(y):str(y+2)].agg(gmean) for y in df.index.year.unique()])
df_gm.index = df.index.year.unique().sort_values()
df_gm
intestinalEnterococciCount
sampleTime
2014 16.230186
2015 16.136248
2016 16.377124
2017 19.529690