在熊猫中特定月份的平均值

时间:2019-01-24 14:39:47

标签: python pandas datetime

我在使用熊猫创建平均值时遇到了麻烦。我的问题是,我想结合每个冬季的11月,12月,1月,2月,3月的平均值来创建平均值,但是它们属于不同的年份,因此我不能只对一个日历内的这些值求平均值年。我尝试将数据分为两个日期时间对象。

nd_npi_obs = ndjfm_npi_obs[ndjfm_npi_obs.index.month.isin([11,12])]
jfm_npi_obs = ndjfm_npi_obs[ndjfm_npi_obs.index.month.isin([1,2,3])]

..但是我在处理日期(年)以进行简单平均时遇到麻烦。我对熊猫没有经验,想知道是否有比出口卓越和改变年份更优雅的方式!数据为表格形式。

Date    
1899-01-01 00:00:00 100994.0
1899-02-01 00:00:00 100932.0
1899-03-01 00:00:00 100978.0
1899-11-01 00:00:00 100274.0
1899-12-01 00:00:00 100737.0
1900-01-01  100655.0
1900-02-01  100633.0 
1900-03-01  100512.0
1900-11-01  101212.0
1900-12-01  100430.0

2 个答案:

答案 0 :(得分:1)

有趣的问题。由于您平均需要五个月以上的时间,因此重新采样更加棘手。您应该能够通过逻辑索引和构建新的数据框来克服这一问题。我认为您的索引是日期时间值。

index = pd.date_range('1899 9 1', '1902, 3, 1', freq='1M')
data = np.random.randint(0, 100, (index.size, 5))
df = pd.DataFrame(index=index, data=data, columns=list('ABCDE'))

# find rows that meet your criteria and average
idx1 = (df.index.year==1899) & (df.index.month >10)
idx2 = (df.index.year==1900) & (df.index.month < 4)

winterAve = df.loc[idx1 | idx2, :].mean(axis=0)

只需要目视检查索引/切片是否在执行我们需要的操作即可。...

>>>df.loc[idx1 | idx2, :]
Out[200]: 
             A   B   C   D   E
1899-11-30  48  91  87  29  47
1899-12-31  63   5   0  35  22
1900-01-31  37   8  89  86  38
1900-02-28   7  35  56  63  46
1900-03-31  72  34  96  94  35

您应该可以将其放入for循环中,以迭代多年,等等。

答案 1 :(得分:0)

使用pd.Grouper按月分组数据

g = df.groupby(pd.Grouper(freq="M"))  # DataFrameGroupBy (grouped by Month)

对于每个组,仅计算“ A”列的平均值

monthly_averages = g.aggregate({"A":np.mean})