Home > Mobile >  Convert a Pandas DataFrame to a dictionary avg rain per month
Convert a Pandas DataFrame to a dictionary avg rain per month

Time:09-27

I have to create a dictionary where the keys are months and the values are avg rain that month for a year (12 months) from this dataframe: https://i.imgur.com/rLcwPBF.png.

The end result (from a function called rain_months()) should look like this:

 [In] Rain_months()

 [Out] {
1: 102.5,
2: 69.2,
3: 80.0,
4: 30.7,
5: 70.3,
6: 20.4,
7: 10.5,
8: 50.0,
9: 78.7,
10: 102.2,
11: 90.5,
12: 80.8,

}

How would I go about doing this the easiest way?

CodePudding user response:

You didn't provide the data. I create my own to look like the one in your image.

daterange = pd.date_range('2021-01-01','2021-12-31',freq='D')
daterange
rainfall = np.random.rand(365)* 100
rainfall
df = pd.DataFrame({'StartUTC': daterange,'SlutUTC': daterange, 'Date': daterange,'Rain': rainfall})
df

Output

StartUTC    SlutUTC         Date        Rain
0   2021-01-01  2021-01-01  2021-01-01  69.711979
1   2021-01-02  2021-01-02  2021-01-02  22.747788
2   2021-01-03  2021-01-03  2021-01-03  54.689692
3   2021-01-04  2021-01-04  2021-01-04  67.699379
4   2021-01-05  2021-01-05  2021-01-05  17.526345
... ... ... ... ...
360 2021-12-27  2021-12-27  2021-12-27  30.267470
361 2021-12-28  2021-12-28  2021-12-28  76.786577
362 2021-12-29  2021-12-29  2021-12-29  29.693561
363 2021-12-30  2021-12-30  2021-12-30  61.648194
364 2021-12-31  2021-12-31  2021-12-31  83.260911
365 rows × 4 columns

In order not to change your original DataFrame, I create a new one with the 2 columns:

def rain_month(df):
    df1 = pd.concat([df['Date'],df['Rain']],axis=1)
    df1['Month'] = pd.to_datetime(df1.Date).dt.month
    df1 = df1.groupby('Month').sum()
    df1.reset_index()
    return df1.to_dict()['Rain']
    
rain_month(df)

Output

{1: 1727.5077622983708,
 2: 1148.8897677989883,
 3: 1232.8023689499066,
 4: 1766.9731141830662,
 5: 1699.0852472560787,
 6: 1427.3383187366533,
 7: 1813.864397566138,
 8: 1374.2262197672233,
 9: 1629.9294176340234,
 10: 1810.487273457173,
 11: 1708.2878840145643,
 12: 1594.6048147191548}

CodePudding user response:

To get the average per month I first created a column which has a uniqe year-month identifier:

import pandas as pd
from datetime import datetime

def datetime_to_year_month(date: datetime) -> str:
    year = str(datetime.fromisoformat(date).year) 
    month = str(datetime.fromisoformat(date).strftime("%b"))
    return '-'.join([year, month])

df['Year-Month'] = df['Dygn'].apply(datetime_to_year_month)

Next, you can simply use pandas groupby method:

avg_df = df.groupby('Year-Month').mean()
result_df = avg_df.rename({"Nederbörd(mm)": "Average Neerbörd(mm)"}, axis=1)

Now convert it to a dictionary:

idx = range(0, len(result_df))
d = {number 1: result_df["Average Neerbörd (mm)"][number] for number in idx}
  • Related