When selling horses, one of the things the customer always seems to want to know is the age of the horse they're buying. It would be a pain to constantly update the age of all my stock, so I decided to figure out instead how long each age lasts so I can programatically estimate a horses age for my sell page. Analyzing 3 years of event logs here's what I came up with  Added the number of wurm months per age Young foal 3 days 4 wurm weeks 1 wurm monthAdolescent foal 10.5 days 12 wurm weeks 3 wurm monthsYoung horse 7 days 8 wurm weeks 2 wurm monthsAdolescent horse 17.5 days 20 wurm weeks 5 wurm monthsMature horse 14 days 16 wurm weeks 4 wurm monthsAged horse 63 days 72 wurm weeks 18 wurm monthsOld horse 35 days 40 wurm weeks 10 wurm monthsThese estimates were based on the timestamp of the event log entries so server uptime and restarts impacts these values. Because they were computed by using an average over the course of 3 years the values should be reasonably accurate assuming an average number of restarts and downtime. And for those curious about how I got these numbers here's what I did. I made a complete listing of all the event logs and made the time stamp for individual entries complete by also including the date. From this I pulled out all entries that reference a horse to further analyze. Wurm is nice enough to include an age as well as the name so this gives me a nice set of sample points with a date, time, horse age, and horse name. From this I calculated transition points: points at which a horse goes from one age to another. In some cases, one log entry has the horse at one age and the next entry it's another age. The actual point the horse switches ages is at some point between these two entries so I assume the mid point. Because the horse could have aged immediatly after the first log entry up to immediatly prior to the following, the maximum error at the midpoint is half the time range. A special case is handled for young foals because if you're near enough when the foal is born, you get a log entry specifically for this event so it's a transition point with no error. Any nonsensical transition points I just discard such as skipping an age or it going backwards. This error is likely due to me not seeing a horse for a very long time or interacting with another horse with the same name that isn't the same horse. To calculate a length of time for a specific age I just take the difference of the dates between the beginning of the age and the begining of the next. The maximum possible error for this length is the sum of the errors on each transition point. Next I filter the results by dropping any lengths of time with a maximum possible error greater than a certain amount. For the output I produced I used a max error of 1.5 days. Because the error is likely non-uniform the actual amount of error will likely have a canceling effect when averaging a number of sampled lengths. There still can be anomolies so I further filter the results by dropping any lengths of time that are well outside the standard deviation. After all this the results were YOUNG_FOAL(Min) - 2 days 10 hours - Max Error: 0 days 2 hoursYOUNG_FOAL(Avg) - 3 days 7 hours - Max Error: 0 days 18 hoursYOUNG_FOAL(Max) - 4 days 6 hours - Max Error: 1 days 3 hoursADOLESCENT_FOAL(Min) - 9 days 13 hours - Max Error: 1 days 7 hoursADOLESCENT_FOAL(Avg) - 10 days 11 hours - Max Error: 1 days 0 hoursADOLESCENT_FOAL(Max) - 11 days 5 hours - Max Error: 1 days 8 hoursYOUNG_HORSE(Min) - 6 days 2 hours - Max Error: 1 days 0 hoursYOUNG_HORSE(Avg) - 7 days 0 hours - Max Error: 0 days 22 hoursYOUNG_HORSE(Max) - 7 days 15 hours - Max Error: 1 days 9 hoursADOLESCENT_HORSE(Min) - 16 days 20 hours - Max Error: 0 days 18 hoursADOLESCENT_HORSE(Avg) - 17 days 15 hours - Max Error: 0 days 21 hoursADOLESCENT_HORSE(Max) - 18 days 12 hours - Max Error: 1 days 2 hoursMATURE_HORSE(Min) - 13 days 0 hours - Max Error: 0 days 10 hoursMATURE_HORSE(Avg) - 13 days 22 hours - Max Error: 0 days 20 hoursMATURE_HORSE(Max) - 14 days 18 hours - Max Error: 1 days 7 hoursAGED_HORSE(Min) - 62 days 1 hours - Max Error: 0 days 1 hoursAGED_HORSE(Avg) - 63 days 5 hours - Max Error: 0 days 20 hoursAGED_HORSE(Max) - 64 days 8 hours - Max Error: 1 days 11 hoursOLD_HORSE(Min) - 33 days 2 hours - Max Error: 0 days 9 hoursOLD_HORSE(Avg) - 34 days 22 hours - Max Error: 0 days 18 hoursOLD_HORSE(Max) - 35 days 17 hours - Max Error: 0 days 23 hoursThe large difference between the minimum and maximum values is likely due to truncation of the data on server restarts similar to how the pregnancy time is truncated. So the maximum values are more likely to be closer to the actual times and an above normal number of server restarts given a time period for a specific age is likely to pull it down near the minimum.