如何计算时间的每月平均值收集数据并用每年该月的值减去每月平均值?

时间:2020-02-07 14:51:52

标签: python python-3.x dataframe

数据集是每天9个变量的每日时间序列,
我已经提取了数据集

Data = pd.read_csv('city10.csv', header = None)
Data['Date'] = pd.date_range(start='1/1/1951', periods=len(Data), freq='D')
Data.set_index('Date', inplace=True)

看起来像这样

 Date         0    1       2       3  ...       5       6         7        8                                  
1951-01-01  28.361  0.0  131.24  405.39  ...  405.39  38.284  0.187010 -1.23550  
1951-01-02  27.874  0.0  113.74  409.56  ...  409.56  49.834  0.066903 -1.44770  
           ...  ...     ...     ...  ...     ...     ...       ...      ...  
2005-12-16  27.921  0.0  104.99  429.78  ...  429.78  47.529 -1.814300 -5.47720  
2005-12-17  27.918  0.0  112.11  425.32  ...  425.32  46.541 -3.314000 -4.02050 

此后,我找到了整个数据集的月份平均值,即

Data.groupby(Data.index.month).mean()

结果是

              0         1           2  ...          6         7         8                              
1     29.619322  0.215978  108.621532  ...  45.868395 -0.234236 -1.865947
2     32.404500  0.290335   95.270385  ...  43.443624  0.554149 -2.360776
3     35.131266  0.364438   78.907920  ...  42.065113  1.458203 -2.636451
4     36.631282  0.998401   53.663939  ...  44.239469  3.146849 -2.193416
5     36.823308  2.113330   37.917831  ...  54.287356  5.241153 -0.694375
6     34.444513  2.195926   35.315554  ...  67.840239  6.393643  0.689087
7     32.951826  3.567160   32.466668  ...  82.347247  6.583195  1.183262
8     32.644236  4.053641   36.379228  ...  85.056697  5.102383  0.005426
9     32.205442  4.885259   50.595568  ...  80.335829  2.413891 -0.578568
10    30.448266  5.748111   79.575731  ...  67.582589 -0.769297 -0.614057
11    28.748315  4.350384  100.293532  ...  53.418955 -1.258580 -1.023143
12    28.155611  1.524177  109.510292  ...  51.317731 -0.936495 -1.549105

现在,如何用每年该月的相应值减去每个月的平均值。
例如 1951-2005年1月月份的平均值为20.25
必须从整个一月月份的每日值中减去此平均值。 该怎么做?

2 个答案:

答案 0 :(得分:0)

原始答案-数据与本月平均值

我将使用In [45]: import pandas as pd In [46]: import numpy as np In [47]: start = datetime.datetime(2011, 1, 1) In [48]: end = datetime.datetime(2012, 1, 1) In [49]: df = pd.DataFrame({'date':pd.date_range(start, periods=1000, freq='D'), 'x':np.random.normal(5,1,1000)}) In [84]: df = pd.DataFrame({'date':pd.date_range(start, periods=1000, freq='D'), 'x':np.random.normal(5,1,1000)}) In [86]: df['month'] = df.date.dt.month In [87]: df.head() Out[87]: date x month 0 2011-01-01 5.139113 1 1 2011-01-02 3.774586 1 2 2011-01-03 6.095986 1 3 2011-01-04 5.037072 1 4 2011-01-05 5.871760 1 2011-01-05 2011-01-05 6.308203 来完成此任务,因为它可以方便地按日期进行汇总。

首先,让我们制作一个示例数据框并添加一个月。

resample

现在,我们可以使用meanIn [58]: monthly_mean = df.resample('M').mean() In [59]: monthly_mean.head() Out[59]: x date 2011-01-31 4.702853 2011-02-28 5.088545 2011-03-31 5.261777 2011-04-30 4.982984 2011-05-31 4.791729 创建一个包含月平均值的新数据框。

In [60]: df['month'] = df.index.month

In [61]: monthly_mean['month'] = monthly_mean.index.month

In [62]: df['year'] = df.index.year

In [63]: monthly_mean['year'] = monthly_mean.index.year

In [64]: df_joined = pd.merge(df, monthly_mean, how='left', on=('year', 'month'))

In [65]: df_joined.head()
Out[65]:
        date       x_x  month  year       x_y
0 2011-01-01  5.388197      1  2011  4.702853
1 2011-01-02  6.442878      1  2011  4.702853
2 2011-01-03  5.979076      1  2011  4.702853
3 2011-01-04  2.846689      1  2011  4.702853
4 2011-01-05  5.103524      1  2011  4.702853

我们可以计算出o

接下来,我们需要将两个数据框合并在一起,以使数据与月平均值对齐。为了简化操作,我将在每个数据框中创建一个年和月列,以用于联接/合并。

In [66]: df_joined['month_diff'] = df_joined.x_x - df_joined.x_y

In [67]: df_joined.head()
Out[67]:
        date       x_x  month  year       x_y  month_diff
0 2011-01-01  5.388197      1  2011  4.702853    0.685344
1 2011-01-02  6.442878      1  2011  4.702853    1.740025
2 2011-01-03  5.979076      1  2011  4.702853    1.276223
3 2011-01-04  2.846689      1  2011  4.702853   -1.856164
4 2011-01-05  5.103524      1  2011  4.702853    0.400670

最后,可以通过减去列来构造新列。

In [88]: monthly_mean = df.groupby('month').agg('mean')

编辑:如果您希望与历史每月平均值有所不同,请进行以下更改。

添加月份,分组依据和合计以获得每月平均值。

'month'

现在,过程将像以前一样进行,这次只是In [90]: df_joined = pd.merge(df, monthly_mean, how='left', on='month') In [91]: df_joined.head() Out[91]: date x_x month x_y 0 2011-01-01 5.139113 1 4.972604 1 2011-01-02 3.774586 1 4.972604 2 2011-01-03 6.095986 1 4.972604 3 2011-01-04 5.037072 1 4.972604 4 2011-01-05 5.871760 1 4.972604 In [92]: df_joined['month_diff'] = df_joined.x_x - df_joined.x_y In [93]: df_joined.head() Out[93]: date x_x month x_y month_diff 0 2011-01-01 5.139113 1 4.972604 0.166509 1 2011-01-02 3.774586 1 4.972604 -1.198018 2 2011-01-03 6.095986 1 4.972604 1.123382 3 2011-01-04 5.037072 1 4.972604 0.064468 4 2011-01-05 5.871760 1 4.972604 0.899156 加入,然后计算差值。

{{1}}

答案 1 :(得分:0)

谢谢大家。我能够解决问题。
我希望这是正确的。

Anomaly_Values = Data.sub(Data.groupby([Data.index.month]).transform('mean'))

让我知道解决方案是否有问题。