terça-feira, 27 de dezembro de 2016

Formatação de data na listagem de arquivos

Para saber a data dos arquivos utilizando a linha de comando de um terminal linux com o parâmetro -l teremos uma lista longa formatada da seguinte maneira:


ls -l *2016_12_26*
-rw-r--r-- 1 2008 2008  39907961 Dez 26 06:49 NOAA_19_HRPT_2016_12_26.05_05_16_CP1.tar.gz
-rw-r--r-- 1 2008 2008  41229371 Dez 26 05:40 NOAA_19_HRPT_2016_12_26.05_06_33_CB1.tar.gz
-rw-r--r-- 1 2008 2008  80397350 Dez 26 07:12 NOAA_19_HRPT_2016_12_26.06_44_15_CB1.tar.gz
-rw-r--r-- 1 2008 2008  34416052 Dez 26 07:05 NOAA_19_HRPT_2016_12_26.06_47_10_CP1.tar.gz
-rw-r--r-- 1 2008 2008 124668738 Dez 26 17:58 NOAA_19_HRPT_2016_12_26.17_37_26_CP1.tar.gz
-rw-r--r-- 1 2008 2008  90894824 Dez 26 18:48 NOAA_19_HRPT_2016_12_26.17_41_19_CB1.tar.gz
-rw-r--r-- 1 2008 2008 101945845 Dez 26 19:42 NOAA_19_HRPT_2016_12_26.19_19_03_CP1.tar.gz
-rw-r--r-- 1 2008 2008 121555056 Dez 26 19:52 NOAA_19_HRPT_2016_12_26.19_20_41_CB1.tar.gz




Porém possível modificar veja este exemplo:

ls -l --time-style=long-iso *2016_12_26*

-rw-r--r-- 1 2008 2008 39907961 2016-12-26 06:49 NOAA_19_HRPT_2016_12_26.05_05_16_CP1.tar.gz
-rw-r--r-- 1 2008 2008 41229371 2016-12-26 05:40 NOAA_19_HRPT_2016_12_26.05_06_33_CB1.tar.gz
-rw-r--r-- 1 2008 2008 80397350 2016-12-26 07:12 NOAA_19_HRPT_2016_12_26.06_44_15_CB1.tar.gz
-rw-r--r-- 1 2008 2008 34416052 2016-12-26 07:05 NOAA_19_HRPT_2016_12_26.06_47_10_CP1.tar.gz
-rw-r--r-- 1 2008 2008 124668738 2016-12-26 17:58 NOAA_19_HRPT_2016_12_26.17_37_26_CP1.tar.gz
-rw-r--r-- 1 2008 2008 90894824 2016-12-26 18:48 NOAA_19_HRPT_2016_12_26.17_41_19_CB1.tar.gz
-rw-r--r-- 1 2008 2008 101945845 2016-12-26 19:42 NOAA_19_HRPT_2016_12_26.19_19_03_CP1.tar.gz
-rw-r--r-- 1 2008 2008 121555056 2016-12-26 19:52 NOAA_19_HRPT_2016_12_26.19_20_41_CB1.tar.gz



Maiores informações sobre cada arquivo podem ser obtidas com o comando stat:

stat *2016_12_26*


File: ‘NOAA_19_HRPT_2016_12_26.05_05_16_CP1.tar.gz’
Size: 39907961 Blocks: 78272 IO Block: 65536 regular file
Device: 3fh/63d Inode: 70646391 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 2008/ UNKNOWN) Gid: ( 2008/ UNKNOWN)
Access: 2016-12-26 07:08:03.013374000 +0000
Modify: 2016-12-26 06:49:04.332533000 +0000
Change: 2016-12-26 06:49:04.332533000 +0000
Birth: -

File: ‘NOAA_19_HRPT_2016_12_26.05_06_33_CB1.tar.gz’
Size: 41229371 Blocks: 80856 IO Block: 65536 regular file
Device: 3fh/63d Inode: 70646390 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 2008/ UNKNOWN) Gid: ( 2008/ UNKNOWN)
Access: 2016-12-26 05:40:19.257489000 +0000
Modify: 2016-12-26 05:40:14.862559000 +0000
Change: 2016-12-26 05:40:14.862559000 +0000
Birth: -

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: