In [1]:
%matplotlib notebook
import matplotlib.pyplot as plt
import math, time, datetime
import numpy as np
from collections import Counter
In [2]:
# These parameters are to be tuned if you want different logarithmic 'curve'...
x=np.linspace(1,120,120)
y=1.09**x
In [3]:
plt.plot(x,y)
Out[3]:
[<matplotlib.lines.Line2D at 0x7fc2836cc880>]
In [4]:
# Points (in hours). Round them and deduplicate:
tbl=set(np.floor(y).tolist()); tbl
Out[4]:
{1.0,
 2.0,
 3.0,
 4.0,
 5.0,
 6.0,
 7.0,
 8.0,
 9.0,
 10.0,
 11.0,
 12.0,
 13.0,
 14.0,
 15.0,
 17.0,
 18.0,
 20.0,
 22.0,
 24.0,
 26.0,
 28.0,
 31.0,
 34.0,
 37.0,
 40.0,
 44.0,
 48.0,
 52.0,
 57.0,
 62.0,
 68.0,
 74.0,
 81.0,
 88.0,
 96.0,
 104.0,
 114.0,
 124.0,
 135.0,
 148.0,
 161.0,
 176.0,
 191.0,
 209.0,
 227.0,
 248.0,
 270.0,
 295.0,
 321.0,
 350.0,
 382.0,
 416.0,
 454.0,
 495.0,
 539.0,
 588.0,
 641.0,
 698.0,
 761.0,
 830.0,
 905.0,
 986.0,
 1075.0,
 1172.0,
 1277.0,
 1392.0,
 1517.0,
 1654.0,
 1803.0,
 1965.0,
 2142.0,
 2335.0,
 2545.0,
 2774.0,
 3024.0,
 3296.0,
 3593.0,
 3916.0,
 4269.0,
 4653.0,
 5072.0,
 5529.0,
 6026.0,
 6569.0,
 7160.0,
 7804.0,
 8507.0,
 9272.0,
 10107.0,
 11016.0,
 12008.0,
 13089.0,
 14267.0,
 15551.0,
 16950.0,
 18476.0,
 20139.0,
 21951.0,
 23927.0,
 26081.0,
 28428.0,
 30987.0}
In [5]:
# How many snapshots are to be kept?
len(tbl)
Out[5]:
103
In [6]:
now=math.floor(time.time())
In [7]:
SECONDS_IN_HOUR=60*60
In [8]:
# Generate date/time points. Only one snapshot to be kept between each adjacent 'points'.
points=sorted(list(map(lambda x: datetime.datetime.fromtimestamp(now-x*SECONDS_IN_HOUR), tbl))); points
Out[8]:
[datetime.datetime(2018, 9, 18, 9, 56, 10),
 datetime.datetime(2019, 1, 2, 23, 56, 10),
 datetime.datetime(2019, 4, 10, 19, 56, 10),
 datetime.datetime(2019, 7, 9, 13, 56, 10),
 datetime.datetime(2019, 9, 29, 21, 56, 10),
 datetime.datetime(2019, 12, 14, 8, 56, 10),
 datetime.datetime(2020, 2, 21, 15, 56, 10),
 datetime.datetime(2020, 4, 25, 6, 56, 10),
 datetime.datetime(2020, 6, 22, 13, 56, 10),
 datetime.datetime(2020, 8, 15, 1, 56, 10),
 datetime.datetime(2020, 10, 3, 3, 56, 10),
 datetime.datetime(2020, 11, 17, 3, 56, 10),
 datetime.datetime(2020, 12, 28, 11, 56, 10),
 datetime.datetime(2021, 2, 4, 8, 56, 10),
 datetime.datetime(2021, 3, 11, 3, 56, 10),
 datetime.datetime(2021, 4, 12, 1, 56, 10),
 datetime.datetime(2021, 5, 11, 8, 56, 10),
 datetime.datetime(2021, 6, 7, 4, 56, 10),
 datetime.datetime(2021, 7, 1, 19, 56, 10),
 datetime.datetime(2021, 7, 24, 10, 56, 10),
 datetime.datetime(2021, 8, 14, 3, 56, 10),
 datetime.datetime(2021, 9, 2, 4, 56, 10),
 datetime.datetime(2021, 9, 19, 15, 56, 10),
 datetime.datetime(2021, 10, 5, 15, 56, 10),
 datetime.datetime(2021, 10, 20, 8, 56, 10),
 datetime.datetime(2021, 11, 2, 18, 56, 10),
 datetime.datetime(2021, 11, 15, 3, 56, 10),
 datetime.datetime(2021, 11, 26, 11, 56, 10),
 datetime.datetime(2021, 12, 6, 21, 56, 10),
 datetime.datetime(2021, 12, 16, 10, 56, 10),
 datetime.datetime(2021, 12, 25, 4, 56, 10),
 datetime.datetime(2022, 1, 2, 5, 56, 10),
 datetime.datetime(2022, 1, 9, 14, 56, 10),
 datetime.datetime(2022, 1, 16, 8, 56, 10),
 datetime.datetime(2022, 1, 22, 13, 56, 10),
 datetime.datetime(2022, 1, 28, 6, 56, 10),
 datetime.datetime(2022, 2, 2, 11, 56, 10),
 datetime.datetime(2022, 2, 7, 6, 56, 10),
 datetime.datetime(2022, 2, 11, 15, 56, 10),
 datetime.datetime(2022, 2, 15, 16, 56, 10),
 datetime.datetime(2022, 2, 19, 9, 56, 10),
 datetime.datetime(2022, 2, 22, 18, 56, 10),
 datetime.datetime(2022, 2, 25, 21, 56, 10),
 datetime.datetime(2022, 2, 28, 18, 56, 10),
 datetime.datetime(2022, 3, 3, 9, 56, 10),
 datetime.datetime(2022, 3, 5, 18, 56, 10),
 datetime.datetime(2022, 3, 7, 23, 56, 10),
 datetime.datetime(2022, 3, 10, 0, 56, 10),
 datetime.datetime(2022, 3, 11, 20, 56, 10),
 datetime.datetime(2022, 3, 13, 13, 56, 10),
 datetime.datetime(2022, 3, 15, 3, 56, 10),
 datetime.datetime(2022, 3, 16, 13, 56, 10),
 datetime.datetime(2022, 3, 17, 21, 56, 10),
 datetime.datetime(2022, 3, 19, 2, 56, 10),
 datetime.datetime(2022, 3, 20, 4, 56, 10),
 datetime.datetime(2022, 3, 21, 5, 56, 10),
 datetime.datetime(2022, 3, 22, 3, 56, 10),
 datetime.datetime(2022, 3, 23, 0, 56, 10),
 datetime.datetime(2022, 3, 23, 18, 56, 10),
 datetime.datetime(2022, 3, 24, 12, 56, 10),
 datetime.datetime(2022, 3, 25, 3, 56, 10),
 datetime.datetime(2022, 3, 25, 18, 56, 10),
 datetime.datetime(2022, 3, 26, 7, 56, 10),
 datetime.datetime(2022, 3, 26, 20, 56, 10),
 datetime.datetime(2022, 3, 27, 8, 56, 10),
 datetime.datetime(2022, 3, 27, 18, 56, 10),
 datetime.datetime(2022, 3, 28, 4, 56, 10),
 datetime.datetime(2022, 3, 28, 12, 56, 10),
 datetime.datetime(2022, 3, 28, 20, 56, 10),
 datetime.datetime(2022, 3, 29, 3, 56, 10),
 datetime.datetime(2022, 3, 29, 10, 56, 10),
 datetime.datetime(2022, 3, 29, 16, 56, 10),
 datetime.datetime(2022, 3, 29, 22, 56, 10),
 datetime.datetime(2022, 3, 30, 3, 56, 10),
 datetime.datetime(2022, 3, 30, 8, 56, 10),
 datetime.datetime(2022, 3, 30, 12, 56, 10),
 datetime.datetime(2022, 3, 30, 16, 56, 10),
 datetime.datetime(2022, 3, 30, 20, 56, 10),
 datetime.datetime(2022, 3, 30, 23, 56, 10),
 datetime.datetime(2022, 3, 31, 2, 56, 10),
 datetime.datetime(2022, 3, 31, 5, 56, 10),
 datetime.datetime(2022, 3, 31, 8, 56, 10),
 datetime.datetime(2022, 3, 31, 10, 56, 10),
 datetime.datetime(2022, 3, 31, 12, 56, 10),
 datetime.datetime(2022, 3, 31, 14, 56, 10),
 datetime.datetime(2022, 3, 31, 16, 56, 10),
 datetime.datetime(2022, 3, 31, 18, 56, 10),
 datetime.datetime(2022, 3, 31, 19, 56, 10),
 datetime.datetime(2022, 3, 31, 21, 56, 10),
 datetime.datetime(2022, 3, 31, 22, 56, 10),
 datetime.datetime(2022, 3, 31, 23, 56, 10),
 datetime.datetime(2022, 4, 1, 0, 56, 10),
 datetime.datetime(2022, 4, 1, 1, 56, 10),
 datetime.datetime(2022, 4, 1, 2, 56, 10),
 datetime.datetime(2022, 4, 1, 3, 56, 10),
 datetime.datetime(2022, 4, 1, 4, 56, 10),
 datetime.datetime(2022, 4, 1, 5, 56, 10),
 datetime.datetime(2022, 4, 1, 6, 56, 10),
 datetime.datetime(2022, 4, 1, 7, 56, 10),
 datetime.datetime(2022, 4, 1, 8, 56, 10),
 datetime.datetime(2022, 4, 1, 9, 56, 10),
 datetime.datetime(2022, 4, 1, 10, 56, 10),
 datetime.datetime(2022, 4, 1, 11, 56, 10)]
In [9]:
# Snapshots kept, per each year:
Counter(map(lambda x: x.year, points))
Out[9]:
Counter({2018: 1, 2019: 5, 2020: 7, 2021: 18, 2022: 72})
In [10]:
# Snapshots kept, per each month:
Counter(map(lambda x: x.year*100 + x.month, points))
Out[10]:
Counter({201809: 1,
         201901: 1,
         201904: 1,
         201907: 1,
         201909: 1,
         201912: 1,
         202002: 1,
         202004: 1,
         202006: 1,
         202008: 1,
         202010: 1,
         202011: 1,
         202012: 1,
         202102: 1,
         202103: 1,
         202104: 1,
         202105: 1,
         202106: 1,
         202107: 2,
         202108: 1,
         202109: 2,
         202110: 2,
         202111: 3,
         202112: 3,
         202201: 5,
         202202: 8,
         202203: 47,
         202204: 12})
In [11]:
# Snapshots kept, per each day:
Counter(map(lambda x: x.year*10000 + x.month*100 +x.day, points))
Out[11]:
Counter({20180918: 1,
         20190102: 1,
         20190410: 1,
         20190709: 1,
         20190929: 1,
         20191214: 1,
         20200221: 1,
         20200425: 1,
         20200622: 1,
         20200815: 1,
         20201003: 1,
         20201117: 1,
         20201228: 1,
         20210204: 1,
         20210311: 1,
         20210412: 1,
         20210511: 1,
         20210607: 1,
         20210701: 1,
         20210724: 1,
         20210814: 1,
         20210902: 1,
         20210919: 1,
         20211005: 1,
         20211020: 1,
         20211102: 1,
         20211115: 1,
         20211126: 1,
         20211206: 1,
         20211216: 1,
         20211225: 1,
         20220102: 1,
         20220109: 1,
         20220116: 1,
         20220122: 1,
         20220128: 1,
         20220202: 1,
         20220207: 1,
         20220211: 1,
         20220215: 1,
         20220219: 1,
         20220222: 1,
         20220225: 1,
         20220228: 1,
         20220303: 1,
         20220305: 1,
         20220307: 1,
         20220310: 1,
         20220311: 1,
         20220313: 1,
         20220315: 1,
         20220316: 1,
         20220317: 1,
         20220319: 1,
         20220320: 1,
         20220321: 1,
         20220322: 1,
         20220323: 2,
         20220324: 1,
         20220325: 2,
         20220326: 2,
         20220327: 2,
         20220328: 3,
         20220329: 4,
         20220330: 6,
         20220331: 12,
         20220401: 12})