'create dataframe from dictionary of datetime and int

I have datetime and int values dictionary like below.

end_date = datetime.datetime.strptime("01-12-2020", "%d-%m-%Y")
details = {
    datetime.datetime.strptime("30-01-2020", "%d-%m-%Y") : 15,
    datetime.datetime.strptime("10-10-2020", "%d-%m-%Y") : 10,
    datetime.datetime.strptime("11-10-2020", "%d-%m-%Y") : 11.5,
    datetime.datetime.strptime("10-11-2020", "%d-%m-%Y") : 20,
    datetime.datetime.strptime("12-11-2020", "%d-%m-%Y") : 23.19,
}

I would like to convert this to below pandas dataframe. Where ever data is not available in the dictionary it should fill with null

enter image description here



Solution 1:[1]

IUUC, you can create an empty dataframe and loop the details and fill value

import calendar

df = pd.DataFrame(index=range(1, 32), columns=list(calendar.month_abbr)[1:])

for k, v in details.items():
    if k < end_date:
        df.loc[k.day, k.strftime("%b")] = v

df = df.add_suffix('-20')
print(df)

   Jan-20 Feb-20 Mar-20 Apr-20 May-20 Jun-20 Jul-20 Aug-20 Sep-20 Oct-20 Nov-20 Dec-20
1     NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
2     NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
3     NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
4     NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
5     NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
6     NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
7     NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
8     NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
9     NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
10    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN     10     20    NaN
11    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   11.5    NaN    NaN
12    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN  23.19    NaN
13    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
14    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
15    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
16    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
17    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
18    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
19    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
20    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
21    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
22    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
23    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
24    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
25    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
26    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
27    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
28    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
29    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
30     15    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
31    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN

Solution 2:[2]

Solution:

import pandas as pd
import datetime
df = pd.DataFrame(columns=[y+'_2020' for y in ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']], index= [x for x in range(1,32)])
month_map={1: 'Jan', 2: 'Feb', 3: 'Mar', 4: 'Apr', 5: 'May', 6: 'Jun', 7: 'Jul', 8: 'Aug', 9: 'Sep', 10: 'Oct', 11: 'Nov', 12: 'Dec'}
details = {
    datetime.datetime.strptime("30-01-2020", "%d-%m-%Y") : 15,
    datetime.datetime.strptime("10-10-2020", "%d-%m-%Y") : 10,
    datetime.datetime.strptime("11-10-2020", "%d-%m-%Y") : 11.5,
    datetime.datetime.strptime("10-11-2020", "%d-%m-%Y") : 20,
    datetime.datetime.strptime("12-11-2020", "%d-%m-%Y") : 23.19,
}

for k1,v1 in details.items():
    df.loc[k1.day, month_map[k1.month] + '_2020']=v1

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Ynjxsjmh
Solution 2 Red