22 1 月 2013

Perl 氣象資料分析及找出遺失資料時間

作者:Ben哥|發布日期:2009/04/06

用 Perl分析氣象觀測資料,找出遺缺的日期及時間

有一筆數據是每半個小時一個記錄,但有時候觀測資料有遺缺,則會沒有資料,該如何用perl檢查數據的時間序列,若遇到遺缺的時間點則列出該時間點。

部份數據格式如下:
2007年第19日時間從0600 – 1100資料有遺缺

:
:
:
2007 19 30 3.3556 231.84 … … …
2007 19 100 3.8435 235.78999 … … …
2007 19 130 4.0448 251.03 … … …
2007 19 200 3.9693 255.75999 … … …
2007 19 230 3.5651 256.70999 … … …
2007 19 300 3.3964 253.72 … … …
2007 19 330 2.4783 247.63 … … …
2007 19 400 1.7784 232.53999 … … …
2007 19 430 1.4422 26.17 … … …
2007 19 500 1.8155 219.75 … … …
2007 19 530 1.7307 226.56 … … …
2007 19 1130 2.9181 301.48999 … … …
2007 19 1200 2.6842 312.23001 … … …
2007 19 1230 3.6911 312.17999 … … …
2007 19 1300 3.3554 300.35001 … … …
2007 19 1330 3.2761 302.17999 … … …
2007 19 1400 3.5768 307.17001 … … …
2007 19 1430 3.0593 294.85001 … … …
2007 19 1500 3.4612 298.82001 … … …
2007 19 1530 4.8399 301.17999 … … …
2007 19 1600 4.6962 298.35999 … … …
2007 19 1630 4.5457 307.51001 … … …
2007 19 1700 4.5081 303.60999 … … …
2007 19 1730 5.1268 272.78 … … …
2007 19 1800 4.3762 99.63 … … …
2007 19 1830 5.6355 287.67001 … … …
2007 19 1900 4.8222 51.7 … … …
2007 19 2000 4.3726 278.56 … … …
2007 19 2030 6.5631 289.76001 … … …
2007 19 2100 4.7712 289.23001 … … …
2007 19 2130 4.8486 291.09 … … …
2007 19 2200 4.0298 300.22 … … …
2007 19 2230 5.1309 304.32001 … … …
2007 19 2300 1.0221 333.35001 … … …
2007 19 2330 1.2376 312.17001 … … …
2007 19 2400 1.3574 272.70999 … … …
2007 20 30 3.3556 23 1.84 … … …
2007 20 100 3. 8435 2 35.78999 … … …
:

#!/usr/bin/perl
#
# 奇科電腦 ( http://www.geego.com.tw )
#
use Time::Local "timelocal_nocheck";

my $previous_time = undef;
my $current_time = undef;

while( <DATA>)
{
next if $_ =~ /^\s*$/;
chomp;
@time_data = ( split( /\s+/ ) )[ 0,1,2 ] ;
my $year = $time_data[ 0 ] – 1900;
my $year_day = $time_data[ 1 ] + 1;
my $hour = ''; my $min = '';
if ( $time_data[ 2 ] !~ /^\d\d$/ )
{
$time_data[ 2 ] =~ /^(\d+?)(\d\d)$/;
$hour = $1; $min = $2;
}
else
{
$hour = 0 ;
$min = $time_data[ 2 ];
}

if ( ! defined( $previous_time ) )
{
$previous_time = timelocal_nocheck(0, $min, $hour, $year_day, 0, $year );
next;
}

$current_time = timelocal_nocheck( 0, $min, $hour, $year_day, 0, $year );

while ( ( $previous_time + 1800 ) != $current_time )
{
@data = ( localtime( $previous_time + 1800 ) )[5, 7, 2, 1 ];
$previous_time += 1800;
printf( "%4d %2d %02d%02d\n", $data[0]+1900, $data[1], $data[2],$data[3] );
}
$previous_time = $current_time;
}

__DATA__
2007 19 30 3.3556 231.84 … … …
2007 19 100 3.8435 235.78999 … … …
2007 19 130 4.0448 251.03 … … …
2007 19 200 3.9693 255.75999 … … …
2007 19 230 3.5651 256.70999 … … …
2007 19 300 3.3964 253.72 … … …
2007 19 330 2.4783 247.63 … … …
2007 19 400 1.7784 232.53999 … … …
2007 19 430 1.4422 26.17 … … …
2007 19 500 1.8155 219.75 … … …
2007 19 530 1.7307 226.56 … … …
2007 19 1130 2.9181 301.48999 … … …
2007 19 1200 2.6842 312.23001 … … …
2007 19 1230 3.6911 312.17999 … … …
2007 19 1300 3.3554 300.35001 … … …
2007 19 1330 3.2761 302.17999 … … …
2007 19 1400 3.5768 307.17001 … … …
2007 19 1430 3.0593 294.85001 … … …
2007 19 1500 3.4612 298.82001 … … …
2007 19 1530 4.8399 301.17999 … … …
2007 19 1600 4.6962 298.35999 … … …
2007 19 1630 4.5457 307.51001 … … …
2007 19 1700 4.5081 303.60999 … … …
2007 19 1730 5.1268 272.78 … … …
2007 19 1800 4.3762 99.63 … … …
2007 19 1830 5.6355 287.67001 … … …
2007 19 1900 4.8222 51.7 … … …
2007 19 2000 4.3726 278.56 … … …
2007 19 2030 6.5631 289.76001 … … …
2007 19 2100 4.7712 289.23001 … … …
2007 19 2130 4.8486 291.09 … … …
2007 19 2200 4.0298 300.22 … … …
2007 19 2230 5.1309 304.32001 … … …
2007 19 2300 1.0221 333.35001 … … …
2007 19 2330 1.2376 312.17001 … … …
2007 19 2400 1.3574 272.70999 … … …
2007 20 30 3.3556 23 1.84 … … …
2007 20 100 3. 8435 2 35.78999 … … …