Python의 pandas 라이브러리를 통해 실행하기 전에 데이터를 변경해야 합니다.
현재 저장 형식은 다음과 같습니다.자정 값은 2400입니다.그래야지0000으로 변경. 형식은 또한 시간이나 분을 채우지 않습니다. 2개의 매개변수를 다음으로 변환해야 한다고 생각합니다.필수 제로 패딩 2400시간(0000-2359)체재.
이제 쉬운 부분이 있습니다!
어려운 부분은 2359에서 0000으로 바뀔 때마다날짜도 바꿔보세요("dayoftheyear" 형식으로, 실제로 가정하기가 더 쉽습니다. 예: 12월 31일을 제외하고 %j +1).
다음은 날짜 롤오버 시 내 데이터(마지막 두 열은 날짜가 아닌 값으로 저장됨)의 예입니다(csv 파일이지만 시각적 명확성을 위해 공백으로 구분했습니다).
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
나는 해결책이 for 루프에 중첩된 sed/awk 묶음이라고 가정하고 있지만 그 문제는 코드 닌자에게 맡기겠습니다. 미리 감사드립니다.
좋아요, 여기에 같은 질문이 있습니다. 하지만 새해가 오면 "만약"을 포함하도록 확장되었습니다.그래서 나는 $2 열이 365에서 366으로 증가할 것이라고 가정하는데, 이는 분명히 바람직하지 않습니다.
그런 다음 연도를 1씩 증가시키기 위해 366으로 롤링을 포함하도록 동일한 증분/형식을 어떻게 확장합니까?
나는 이것을 맹목적으로 시도할 것이다:
#!/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
나는 모든 것을 스크립트에 통합하려고 하는데, 여기에 원시 데이터(예: home.dat)가 입력되어 파일(예: home_prepped.dat)이 출력됩니다.
위 데이터는 위 스크립트를 실행한 결과입니다.
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
답변1
awk
이 모든 작업은 자체적으로 수행됩니다.sprintf
포맷, 일반 모드, 배포가 나머지 작업을 수행합니다.
$3 == "2400" {$2 = $2 + 1; $3 = 0}
{ $3 = sprintf("%04i", $3) }
1
이를 넣은 경우 dates.awk
다음을 통해 샘플 데이터를 실행하십시오.
$ awk -F, -vOFS=, -f dates.awk < data
그러면 다음을 얻게 됩니다:
...
2014,344,2359,0,0
2014,345,0000,0,0
2014,345,0001,0,0
...
스크립트의 첫 번째 줄은 다음 명령을 사용하여 세 번째 필드가 "2400"인지 확인합니다.표현 패턴그리고제로섬 델타적절하게. 두 번째는 필드를 4자리 숫자로 채웁니다.sprintf
. 마지막은 해당 줄이 인쇄되도록 보장합니다.
이를 모두 한 줄로 압축하여 awk
명령줄에 스크립트를 제공하거나 {FS=OFS=","}
.
연간 롤오버를 스스로 처리할 수 있습니다. 위의 내용을 쉽게 흉내낼 수 있지만 스스로 노력하면 도움이 될 것입니다.
답변2
그러면 세 번째 필드가 동일하면 2400
이를 변경 0000
하고 두 번째 필드를 1씩 추가하시겠습니까? 그러니 awk
이것을 시도해 보세요:
awk 'BEGIN{FS=OFS=","}$3==2400{$2++;$3="0000"}1'