【问题标题】:How to subtract dataframe with month index from dataframe with datetime index如何从具有日期时间索引的数据框中减去具有月份索引的数据框
【发布时间】:2021-04-26 07:03:53
【问题描述】:

我有两个数据框,一个叫Clim,一个叫O3_mda8_3135Clim是一个数据框,包括一年数据的月平均气象参数;这是数据框的示例:

Clim.head(12)
Out[7]: 
       avgT_2551  avgT_5330  ...  avgNOx_3135(ppb)  avgCO_3135(ppm)
Month                        ...                                   
1      14.924181  13.545691  ...         48.216128         0.778939
2      16.352172  15.415385  ...         36.110385         0.605629
3      20.530879  19.684720  ...         20.974544         0.460571
4      23.738576  22.919158  ...         14.270995         0.432855
5      26.961927  25.779007  ...         11.087005         0.334505
6      32.208322  31.225072  ...         12.801409         0.384325
7      35.280124  34.265880  ...         10.732970         0.321284
8      35.428857  34.433351  ...         11.916420         0.326389
9      32.008317  30.856782  ...         15.236616         0.343405
10     25.691444  24.139874  ...         24.829518         0.467317
11     19.310550  17.827946  ...         36.339847         0.621938
12     14.186050  12.860077  ...         49.173287         0.720708

[12 rows x 20 columns]

我还有数据框O3_mda8_3135,它是通过首先计算每个组件的滚动 8 小时平均值,然后找到臭氧的最大每日值创建的,这就是所有时间戳和索引都不同的原因。一年中的每一天,每个气象参数都有一个值。这是此数据框的示例:

 O3_mda8_3135
Out[9]: 
                    date  Temp_C_2551  ...  CO_3135(ppm)  O3_mda8_3135
12   2018-01-01 12:00:00         24.1  ...         0.294       10.4000
36   2018-01-02 12:00:00         26.3  ...         0.202        9.4375
60   2018-01-03 12:00:00         22.8  ...         0.184        7.1625
84   2018-01-04 12:00:00         25.6  ...         0.078        8.2500
109  2018-01-05 13:00:00         27.3  ...           NaN        9.4500
                 ...          ...  ...           ...           ...
8653 2018-12-27 13:00:00         19.6  ...         0.115       35.1125
8676 2018-12-28 12:00:00         14.9  ...         0.097       39.4500
8700 2018-12-29 12:00:00         13.9  ...         0.092       38.1250
8724 2018-12-30 12:00:00         17.4  ...         0.186       35.1375
8753 2018-12-31 17:00:00          8.3  ...         0.110       30.8875

[365 rows x 24 columns]

我想知道如何从O3_mda8_3135 中的相应列和行中减去Clim 中的平均值。例如,我想从另一个数据框O3_mda8_3135、列名Temp_C_2551 中的一月份的每一天中减去一月份站点 2551 的温度平均值(avgT_2551 数据框中的第 1 个月)。

avgT_2551 对应于另一个数据帧中的Temp_C_2551

有没有简单的方法来做到这一点?我应该从日期时间中提取月份并将其放入 O3_mda8_3135 数据框的另一列吗?我仍然是初学者,如果有任何建议或提示,我将不胜感激。

我看到了这篇帖子 How to subtract the mean of a month from each day in that month?,但没有足够的信息让我了解正在执行的操作。

【问题讨论】:

    标签: python pandas dataframe datetime subtraction


    【解决方案1】:

    感谢 Stack Overflow 帖子,我自己解决了 :)

    我在与月份对应的两个数据框中创建了新列。我最初使用Clim = Clim.set_index('Month')Clim 中的索引设置为月份,所以我删除了该行。然后,我在 O3_mda8_3135 数据框中为 Month 创建了一个列。之后,我根据“月份”列合并了两个数据框,然后使用 pd.sub 函数减去我想要的列。

    这是一些示例代码,抱歉变量太长了,但是这个数据框很大。

    O3_mda8_3135['Month'] = O3_mda8_3135['date'].dt.month
    O3_mda8_3135_anom = pd.merge(O3_mda8_3135, Clim, how='left', on=('Month'))
    O3_mda8_3135_anom['O3_mda8_3135_anom'] = O3_mda8_3135_anom['O3_mda8_3135'].sub(O3_mda8_3135_anom['MDA8_3135'])
    

    这些帖子帮助我回答了我的问题:

    【讨论】:

    • 考虑assign 更短:pd.merge(O3_mda8_3135, Clim, how='left', on=('Month')).assign(O3_mda8_3135_anom = lambda x: x['O3_mda8_3135'].sub(x['MDA8_3135']))
    猜你喜欢
    • 2020-09-16
    • 2022-09-22
    • 2018-01-02
    • 2018-11-23
    • 2020-06-04
    • 1970-01-01
    • 2019-03-08
    • 2021-07-13
    • 2019-11-29
    相关资源
    最近更新 更多