Algorithm-Time-ToNumber
Convert time to a number.
-
circle :: return two angles suitable for use as two features with isolation forest
-
angle :: similar to circle, but only one angle... produces a consistent range but will overlap with it's self
-
noon_fail :: Wraps at 00:00 but will produce a gap at 12:00.
-
midnight_fail :: Wraps at 12:00 but will produce a gap at 00:00.
-
suricata_to_circle :: Takes the .timestamp value like in Suricata EVE files, removes the date and timezone part, and then feeds it to circle before returning the result.
The one you likely want is circle.
So when using it with isolation forest you will have each returned angle be it's own feature for a row. While each feature will overlap with it's self at a point, the use of two helps avoid the clustering issue.
use Algorithm::Time::ToNumber;
print "---------------------------------------------------\n";
print "------------------noon_fail------------------------\n";
print "---------------------------------------------------\n";
my $hour=0;
while ($hour < 24) {
my $time = $hour . ':00';
print $time . ' ' . Algorithm::Time::ToNumber->noon_fail($time) . "\n";
$time = $hour . ':30';
print $time . ' ' . Algorithm::Time::ToNumber->noon_fail($time) . "\n";
$hour++;
}
print "---------------------------------------------------\n";
print "----------------midnight_fail----------------------\n";
print "---------------------------------------------------\n";
$hour=0;
while ($hour < 24) {
my $time = $hour . ':00';
print $time . ' ' . Algorithm::Time::ToNumber->midnight_fail($time) . "\n";
$time = $hour . ':30';
print $time . ' ' . Algorithm::Time::ToNumber->midnight_fail($time) . "\n";
$hour++;
}
print "---------------------------------------------------\n";
print "---------------------circle------------------------\n";
print "---------------------------------------------------\n";
# this is what you want if you plan to use it with isolation forest
$hour=0;
while ($hour < 24) {
my $time = $hour . ':00';
my ($sin_angle, $cos_angle) = Algorithm::Time::ToNumber->circle($time);
print $time . ' ' . $sin_angle . ' ' . $cos_angle . "\n";
$time = $hour . ':30';
($sin_angle, $cos_angle) = Algorithm::Time::ToNumber->circle($time);
print $time . ' ' . $sin_angle . ' ' . $cos_angle . "\n";
$hour++;
}
print "---------------------------------------------------\n";
print "----------------------angle------------------------\n";
print "---------------------------------------------------\n";
$hour=0;
while ($hour < 24) {
my $time = $hour . ':00';
my ($sin_angle) = Algorithm::Time::ToNumber->circle($time);
print $time . ' ' . $sin_angle . "\n";
$time = $hour . ':30';
($sin_angle, $cos_angle) = Algorithm::Time::ToNumber->circle($time);
print $time . ' ' . $sin_angle . "\n";
$hour++;
}
print "---------------------------------------------------\n";
print "--------------suricata_to_circle-------------------\n";
print "---------------------------------------------------\n";
$hour = 0;
while ($hour < 24) {
my $time = '2026-07-03T' .$hour . ':00:31.121465-0500';
my ($sin_angle, $cos_angle) = Algorithm::Time::ToNumber->suricata_to_circle($time);
print $time . ' ' . $sin_angle . ' ' . $cos_angle . "\n";
$time = '2026-07-03T' .$hour . ':00:31.121465-0500';
($sin_angle, $cos_angle) = Algorithm::Time::ToNumber->suricata_to_circle($time);
print $time . ' ' . $sin_angle . ' ' . $cos_angle . "\n";
$hour++;
}
Install
Source
perl Makefile.PL
make
make test
make install
FreeBSD
pkg install p5-App-cpanminus
cpanm Algorithm::Time::ToNumber
Debian
apt-get install cpanminus
cpanm Algorithm::Time::ToNumber