altere a hora e o minuto acolados de zero em 24 horas

1

Eu tenho dados que preciso alterar antes de executá-lo na biblioteca pandas em python.

No momento, ele está em um formato que armazena valores da meia-noite como 2400 e que deve ser alterado para 0000 . O formato também não preenche nem a hora nem o minuto, e eu acho que preciso fazê-lo para converter os 2 parâmetros em um formato desejado preenchido com zero 2400hr (0000-2359) .

Agora essa é a parte fácil!

A parte difícil é que cada vez que passar de 2359 para 0000, deve também alterar a data (que está no formato 'dayoftheyear', o que realmente torna mais fácil, suponho, por exemplo:% j +1, além de 31 de dezembro).

Portanto, aqui está uma amostra dos meus dados (as últimas duas colunas são valores não-data armazenados) na rolagem de um dia (é um arquivo csv, mas estou mostrando com um único espaço para delimitar a claridade visual):

1,2014,361,2340,0,0
1,2014,361,2341,0,0
1,2014,361,2342,0,0
1,2014,361,2343,0,0
1,2014,361,2344,0,0
1,2014,361,2345,0,0
1,2014,361,2346,0,0
1,2014,361,2347,0,0
1,2014,361,2348,0,0
1,2014,361,2349,0,0
1,2014,361,2350,0,0
1,2014,361,2351,0,0
1,2014,361,2352,0,0
1,2014,361,2353,0,0
1,2014,361,2354,0,0
1,2014,361,2355,0,0
1,2014,361,2356,0,0
1,2014,361,2357,0,0
1,2014,361,2358,0,0
1,2014,361,2359,0,0
1,2014,361,2400,0,0
24,2014,361,2400,12.34
1,2014,365,2359,0,9
1,2014,365,2400,089.343,3
1,2015,1,1,234,456
1,2015,1,2,090,99
1,2015,365,2359,0,0
1,2015,365,2400,xx,xxx
1,2016,1,1,0,0
1,2016,1,2,0,0
1,2016,1,3,0,0

Eu suponho que a solução é um monte de sed / awk aninhado em um loop for, mas vou deixar isso para você ninjas de código. Agradecemos antecipadamente.

Ok, aqui está a mesma pergunta, mas estendida para incluir o "e se" depois que o novo ano chegar. Então eu suponho que a coluna de $ 2 será incrementada entre 365 e 366, e isso obviamente não é desejável.

Como faço para estender o mesmo incremento / formatação para incluir um rollover 366 para incrementar o ano em 1?

Eu vou tentar cegamente:

#!/bin/bash


filename="${1/.dat/_prepped.dat}"

awk '/^1/{print $0}' $1  |cut -d "," -f2,3,4,5,6 |

awk 'BEGIN{FS=OFS=","}
$3 == "2400" {$2 = $2 + 1; $3 = 0}
$2 == "366" {$1 = $1 + 1; $2 = 1}
{ $3 = sprintf("%04i", $3) }
1' >$filename

Eu tentei integrar tudo em um script que eu alimentei os dados brutos (ex: home.dat) para gerar o arquivo (ex: home_prepped.dat).

Resultados dos dados acima que passam pelo script acima:

2014,361,2340,0,0
2014,361,2341,0,0
2014,361,2342,0,0
2014,361,2343,0,0
2014,361,2344,0,0
2014,361,2345,0,0
2014,361,2346,0,0
2014,361,2347,0,0
2014,361,2348,0,0
2014,361,2349,0,0
2014,361,2350,0,0
2014,361,2351,0,0
2014,361,2352,0,0
2014,361,2353,0,0
2014,361,2354,0,0
2014,361,2355,0,0
2014,361,2356,0,0
2014,361,2357,0,0
2014,361,2358,0,0
2014,361,2359,0,0
2014,362,0000,0,0
2014,365,2359,0,9
2015,1,0000,089.343,3
2015,1,0001,234,456
2015,1,0002,090,99
2015,365,2359,0,0
2016,1,0000,xx,xxx
2016,1,0001,0,0
2016,1,0002,0,0
2016,1,0003,0,0
    
por geokrowding 28.12.2014 / 23:41

2 respostas

1

awk faz tudo isso sozinho. sprintf a formatação, padrões comuns e atribuições fazem o resto.

$3 == "2400" {$2 = $2 + 1; $3 = 0}
{ $3 = sprintf("%04i", $3) }
1

Se você colocar isso em dates.awk e, em seguida, executar seus dados de amostra por meio de:

$ awk -F, -vOFS=, -f dates.awk < data

você terá:

...
2014,344,2359,0,0
2014,345,0000,0,0
2014,345,0001,0,0
...

A primeira linha do script verifica se o terceiro campo é "2400" usando um padrão de expressão e zeros e incrementos apropriadamente. O segundo insere o campo em quatro dígitos com sprintf . O último garante que a linha seja impressa.

Você pode esmagar tudo em uma única linha para fornecer um script para awk na linha de comando e também colocar os separadores de campo no corpo, colocando {FS=OFS=","} .

Você pode lidar com a rolagem do ano por conta própria; você deve ser capaz de padronizá-lo facilmente acima, mas fazer o esforço por si mesmo fará bem a você.

    
por 28.12.2014 / 23:58
0

Portanto, se o terceiro campo for igual a 2400 , você deseja alterá-lo para 0000 e aumentar o segundo campo em um? Tente awk então:

awk 'BEGIN{FS=OFS=","}$3==2400{$2++;$3="0000"}1'
    
por 28.12.2014 / 23:52