quinta-feira, 28 de julho de 2016

Como inserir dados no postgresql utilizando o comando COPY

O comando copy do postgresql pode ser utilizado tanto para a entrada quanto para a saída de dados de e para um arquivo texto.
Para agilizar meu trabalho de popular uma tabela de focos de queimadas neste exercício estou utilizando um arquivo CSV como fonte de dados. Note no exemplo abaixo que o arquivo é separado por virgulas e possui um cabecalho na primeira linha.

YYYYMMDD,HHMM,sat,lat,lon,T21,T31,sample,FRP,conf,type
20160401,0013,T,-9.929,151.006,313.3,295.8,490,6.3,43,0
20160401,0016,T,-21.804,149.064,314.0,294.5,571,7.5,48,0
20160401,0017,T,-23.772,151.204,315.0,300.3,827,8.2,0,2

Previamente foi criada uma tabela no banco de dados que apresentam os mesmos campos deste arquivo, e no meu caso ainda existem outros mais que vou popular depois utilizando cruzamento espacial. Por este motivo o comando copy precisa receber uma lista com o nome dos campos que foram definidos na tabela, porém mantendo a ordem do arquivo CSV.

COPY tabela_banco(data,hora,sat,lat,lon,T21,T31,sample,FRP,conf,tipo) 
FROM '/path/to/file.csv' DELIMITER ',' CSV HEADER

Desta maneira o processo é muito rápido.

quarta-feira, 27 de julho de 2016

Ajustes em um arquivo CSV

Tive alguns problemas na conversao de dados que estavam separados por espacos para formatar um arquivo separados por virgula (CSV). Neste arquivo de entrada haviam vários separadores entre um campo e outro e que deveriam ser substituídos por um único, veja o exemplo do dado de entrada:

YYYYMMDD HHMM sat lat lon T21 T31 sample FRP conf type
20160401 0013 T  -9.929  151.006 313.3 295.8  490     6.3  43  0
20160401 0016 T -21.804  149.064 314.0 294.5  571     7.5  48  0
20160401 0017 T -23.772  151.204 315.0 300.3  827     8.2   0  2


Entao, com uso do comando SED:
sed -i.bak 's/ \{1,\}/,/g' MCD14ML.20160?.006.01.txt

Conseguí fazer a conversao dos dados para:

YYYYMMDD,HHMM,sat,lat,lon,T21,T31,sample,FRP,conf,type
20160401,0013,T,-9.929,151.006,313.3,295.8,490,6.3,43,0
20160401,0016,T,-21.804,149.064,314.0,294.5,571,7.5,48,0
20160401,0017,T,-23.772,151.204,315.0,300.3,827,8.2,0,2

Um detalhe deste comando é que o -i faz a substituicao no mesmo arquivo, porém com -i.bak ele adiciona esta extencao no arquivo original mantendo uma cópia.

quarta-feira, 20 de julho de 2016

Manipulação de datas no Python

Sempre que tenho que trabalhar com datas em scripts python utilizo as funções date da seguinte maneira:


import datetime as dt

def calc_lista_datas(datainicial, intervalo):
saida = []
    for d in range(1, intervalo +1):
      d1 = dt.datetime.strptime(str(datainicial), '%Y%m%d')
      d2 = d1 - dt.timedelta(days=int(d))
      print d, d2.strftime('%Y%m%d')
      saida.append(d2.strftime('%Y%m%d'))
    return saida

print calc_lista_datas(20160101, 120)

Isto ajuda a criar uma lista de datas.
Maiores detalhes recomendo: