Tenho dados meteorológicos em um dicionário Python que estou tentando converter para um arquivo DF do Pandas. (De lá, vou carregá-los no SQLServer, mas essa parte já está funcionando)
my_dict = {
'data.outdoor.temperature': {'unit': '℃', 'list':
{'datetime.datetime(2025, 4, 23, 10, 0): 22.3',
'datetime.datetime(2025, 4, 23, 14, 0): 21.3',
'datetime.datetime(2025, 4, 23, 18, 0): 18.2', }},
'data.indoor.temperature': {'unit': '℃', 'list':
{'datetime.datetime(2025, 4, 23, 10, 0): 23.2',
'datetime.datetime(2025, 4, 23, 14, 0): 23.5',
'datetime.datetime(2025, 4, 23, 18, 0): 22.9'}}}
O resultado que estou buscando é:
outdoor.temperature | 2025_04_20 | 14 | 28.1 | ℃
outdoor.temperature | 2025_04_20 | 18 | 23.8 | ℃
.....etc
indoor.temperature | 2025_04_20 | 14 | 23.5 | ℃
indoor.temperature | 2025_04_20 | 18 | 23.8 | ℃
.....etc
A lista de datetime
& temperatures
pode ter centenas de registros
Eu tentei from_dict
, concat
/ unstack
, normalize
, flatten
e combinações de todos eles, mas estou derrotado
Alterei seu construtor de dicionário para construir objetos de data e hora em vez de ter um conjunto de strings com formato
datetime.datetime(#, #, #, #, #): ##.#
, como interpretei como sendo no formato de dicionário:Depois, construí uma representação de dicionário, anexei a
unit
coluna como um índice, transformei a coluna da lista em uma Série (descompactando-a), antes de empilhar tudo e redefinir o índice.Isso resultou no seguinte:
(Pode parecer desalinhado porque o caractere ℃ é mais largo que o caractere monoespaçado padrão.) Você pode então renomear colunas atribuindo a
df.columns
. Eu escolhidf.columns = ['where', 'unit', 'date', 'temp']
.Você pode limpar
where
de forma bem simples:df['where'] = df['where'].str.replace(r'^data\.', '', regex=True)
.O construtor também é fornecido
temp
como uma string, eu fariadf['temp'] = df['temp'].pipe(pd.to_numeric)
para torná-lo numérico.