Skip to content

Instantly share code, notes, and snippets.

@mikebirdgeneau
Created April 6, 2016 01:18
Show Gist options
  • Save mikebirdgeneau/8a88f18cec66e66161a77eddab6b9ddb to your computer and use it in GitHub Desktop.
Save mikebirdgeneau/8a88f18cec66e66161a77eddab6b9ddb to your computer and use it in GitHub Desktop.
When is your birthday if you're born on Feb 29th of a leap year?
from skyfield.api import load
from scipy import optimize
from datetime import datetime
from dateutil import tz
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
def earthPosition(t1):
planets = load('de430.bsp')
sun, earth, mars = planets['SUN'], planets['EARTH BARYCENTER'], planets['MARS BARYCENTER']
ts = load.timescale()
t0 = ts.utc(2016, 2, 29, 21, 33, 0) # UTC
astrometric = sun.at(t0).observe(earth)
ra0, dec0, distance0 = astrometric.radec()
t1 = ts.tai(jd=t1)
astrometric1 = sun.at(t1).observe(earth)
ra1, dec1, distance1 = astrometric1.radec()
return abs( dec0.radians - dec1.radians )
def findBirthday( yr ):
ts = load.timescale()
tmin = ts.utc(yr,2,28,0,0,0).tai
tmax = ts.utc(yr,3,1,23,59,59).tai
x0 = ts.utc(yr,2,28,23,59,59).tai
best, val, des = optimize.fmin_l_bfgs_b(earthPosition, x0, bounds=[(tmin,tmax)],
approx_grad=True, iprint=-1)
tres = ts.tai(jd=best).utc_iso()
tres = datetime.strptime(tres[0],'%Y-%m-%dT%H:%M:%SZ')
tres = tres.replace(tzinfo=tz.gettz("UTC"))
return(tres.astimezone(tz.gettz("America/Edmonton")))
birthdays = []
for year in range(2016,2025):
result = findBirthday(year)
birthdays.append(str(result))
print(str(year) + ": " + str(result))
df = pd.DataFrame({'Year' : range(2016,2025), 'Birthday' : birthdays})
df.to_csv('birthdays.csv')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment