#!/usr/bin/perl use strict; use warnings; use List::Util qw( min max sum ); use Data::Dumper; my @funcs = ( undef, # first_timestamp \&avg, \&max, \&min, \&first, \&last, ); my @records = ( # Timestamp.usecs AVGTEMP MAXTEMP MINTEMP STARTTEMP ENDTEMP [ 1234567891.123456, 36.5, 36.9, 36.2, 36.4, 36.6 ], [ 1234567891.654321, 36.6, 40.1, 36.2, 36.6, 36.8 ], [ 1234567893.123456, 36.3, 38.8, 35.1, 36.8, 37.3 ], [ 1234567893.654321, 36.2, 36.9, 36.2, 37.3, 37.1 ], [ 1234567894.123456, 36.8, 37.3, 36.2, 37.1, 37.4 ], ); # Main print " Timestamp AVG MAX MIN START END\n"; print( '[ ', join( ', ', @{ $_ } ), " ]\n" ) for( @records ); print "\n"; my @output = downsample( 5, \@records ); print " Timestamp AVG MAX MIN START END\n"; print '[ ', join( ', ', @output ), " ]\n"; # Subs sub downsample { my( $resolution, $data ) = @_; my $newdata = transpose( $data ); my $first_timestamp = first_timestamp_for_resolution( $resolution, $newdata->[0][0] ); my @output; push( @output, $first_timestamp ); push( @output, $funcs[$_]->( @{$newdata->[$_]} ) ) for ( 1..$#funcs ); return( @output ); } sub first_timestamp_for_resolution { my( $resolution, $value ) = @_; # $resolution in seconds return( int( $value - ( $value % $resolution ) ) ); } # from Math::Matrix sub transpose { my( $matrix ) = shift; my( $m, @result ); for my $col ( @{ $matrix->[0] } ) { push( @result, [] ); } for my $row ( @{$matrix} ) { $m=0; for my $col ( @{$row} ) { push( @{ $result[$m++] }, $col ); } } return( \@result ); } sub first { return( $_[0] ); } sub last { return( $_[-1] ); } sub avg { return( sum( @_ ) / scalar( @_ ) ); }