from datetime import datetime from dateutil.relativedelta import relativedelta def keep_date(now, snapshots, date_convert, delta, count): keep = set() if count < 1: return keep start_date = date_convert(now) - delta*(count-1) for snapshot in snapshots: if snapshot.date() >= start_date: keep.add(snapshot) start_date = date_convert(snapshot) + delta if start_date > now.date(): break return keep def keep_year(now, snapshots, count): return keep_date(now, snapshots, lambda d: d.date().replace(day=1, month=1), relativedelta(years=1), count) def keep_month(now, snapshots, count): return keep_date(now, snapshots, lambda d: d.date().replace(day=1), relativedelta(months=1), count) def keep_day(now, snapshots, count): return keep_date(now, snapshots, lambda d: d.date(), relativedelta(days=1), count) def keep_time(now, snapshots, convert, delta, count): keep = set() if count < 1: return keep start = convert(now) - delta*(count-1) for snapshot in snapshots: if snapshot >= start: keep.add(snapshot) start = convert(snapshot) + delta if start > now: break return keep def keep_hour(now, snapshots, count): return keep_time(now, snapshots, lambda d: d.replace(minute=0, second=0, microsecond=0), relativedelta(hours=1), count) def keep_frequent(now, snapshots, count): return keep_time(now, snapshots, lambda d: d.replace(minute=d.minute//15*15, second=0, microsecond=0), relativedelta(minutes=15), count) def snapshots_to_keep(now, snapshots, yearly=0, monthly=0, weekly=0, daily=0, hourly=0, frequently=0): snapshots.sort() keep = set() keep.union(keep_year(now, snapshots, yearly)) keep.union(keep_month(now, snapshots, monthly)) keep.union(keep_day(now, snapshots, daily)) return keep def main(): print("Hello, world!")