Skip to content

Instantly share code, notes, and snippets.

@siedentop
Last active November 30, 2020 07:17
Show Gist options
  • Save siedentop/d0ff7fc6f7831a1411b02ed9858d48bd to your computer and use it in GitHub Desktop.
Save siedentop/d0ff7fc6f7831a1411b02ed9858d48bd to your computer and use it in GitHub Desktop.
Compute the northern latitude where total daylight time is the same in May (31 days) and June (30 days).
#!/usr/bin/env python3
"""
Reference: https://twitter.com/djg98115/status/1333275207369277442
http://mathforum.org/library/drmath/view/56478.html
D = daylength
L = latitude
J = day of the year
P = asin[.39795*cos(.2163108 + 2*atan{.9671396*tan[.00860(J-186)]})]
_ _
/ sin(0.8333*pi/180) + sin(L*pi/180)*sin(P) \
D = 24 - (24/pi)*acos{ ----------------------------------------- }
\_ cos(L*pi/180)*cos(P) _/
"""
import pint # Not used just kept to show my good intention.
from math import asin, cos, atan, tan, sin, pi, acos
from datetime import date
from scipy import optimize
def daylength(latitude, day_of_year):
P = p_helper(day_of_year)
numerator = sin(0.8333 * pi / 180) + sin(latitude * pi / 180) * sin(P)
denominator = cos(latitude * pi / 180) * cos(P)
D = 24 - (24 / pi) * acos(numerator / denominator)
return D
def p_helper(day_of_year):
return asin(
0.39795
* cos(0.2163108 + 2 * atan(0.9671396 * tan(0.00860 * (day_of_year - 186))))
)
def daylength_range(start, stop, latitude):
return sum(daylength(latitude=latitude, day_of_year=d) for d in range(start, stop))
def daylength_may(latitude):
jan1 = date(2021, 1, 1)
start = (date(2021, 5, 1) - jan1).days
end = (date(2021, 5, 31) - jan1).days
return daylength_range(start, end, latitude=latitude)
def daylength_june(latitude):
jan1 = date(2021, 1, 1)
start = (date(2021, 6, 1) - jan1).days
end = (date(2021, 6, 30) - jan1).days
return daylength_range(start, end, latitude=latitude)
if __name__ == "__main__":
def f(lat):
if lat < 0.1 or lat > 90.0:
return 100000
diff = daylength_may(latitude=lat) - daylength_june(latitude=lat)
return diff ** 2
result = optimize.minimize_scalar(f)
if result.success:
latitude = result.x
may = daylength_may(latitude=latitude)
june = daylength_june(latitude=latitude)
print(f"At latitude {latitude}")
print(f"May has a total of \t{may} hours of daylight. Avg: {may/31}")
print(f"June has a total of \t{june} hours of daylight. Avg: {june / 30}")
else:
print(f"Failed to find result. {result}")
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
pint = "*"
sympy = "*"
scipy = "*"
[dev-packages]
[requires]
python_version = "3.8"
{
"_meta": {
"hash": {
"sha256": "630de5e478402d0bc4eb2c98b3ee0615132440cf3368575a577ac2e2b0b4f0d3"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.8"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"mpmath": {
"hashes": [
"sha256:fc17abe05fbab3382b61a123c398508183406fa132e0223874578e20946499f6"
],
"version": "==1.1.0"
},
"numpy": {
"hashes": [
"sha256:08308c38e44cc926bdfce99498b21eec1f848d24c302519e64203a8da99a97db",
"sha256:09c12096d843b90eafd01ea1b3307e78ddd47a55855ad402b157b6c4862197ce",
"sha256:13d166f77d6dc02c0a73c1101dd87fdf01339febec1030bd810dcd53fff3b0f1",
"sha256:141ec3a3300ab89c7f2b0775289954d193cc8edb621ea05f99db9cb181530512",
"sha256:16c1b388cc31a9baa06d91a19366fb99ddbe1c7b205293ed072211ee5bac1ed2",
"sha256:18bed2bcb39e3f758296584337966e68d2d5ba6aab7e038688ad53c8f889f757",
"sha256:1aeef46a13e51931c0b1cf8ae1168b4a55ecd282e6688fdb0a948cc5a1d5afb9",
"sha256:27d3f3b9e3406579a8af3a9f262f5339005dd25e0ecf3cf1559ff8a49ed5cbf2",
"sha256:2a2740aa9733d2e5b2dfb33639d98a64c3b0f24765fed86b0fd2aec07f6a0a08",
"sha256:4377e10b874e653fe96985c05feed2225c912e328c8a26541f7fc600fb9c637b",
"sha256:448ebb1b3bf64c0267d6b09a7cba26b5ae61b6d2dbabff7c91b660c7eccf2bdb",
"sha256:50e86c076611212ca62e5a59f518edafe0c0730f7d9195fec718da1a5c2bb1fc",
"sha256:5734bdc0342aba9dfc6f04920988140fb41234db42381cf7ccba64169f9fe7ac",
"sha256:64324f64f90a9e4ef732be0928be853eee378fd6a01be21a0a8469c4f2682c83",
"sha256:6ae6c680f3ebf1cf7ad1d7748868b39d9f900836df774c453c11c5440bc15b36",
"sha256:6d7593a705d662be5bfe24111af14763016765f43cb6923ed86223f965f52387",
"sha256:8cac8790a6b1ddf88640a9267ee67b1aee7a57dfa2d2dd33999d080bc8ee3a0f",
"sha256:8ece138c3a16db8c1ad38f52eb32be6086cc72f403150a79336eb2045723a1ad",
"sha256:9eeb7d1d04b117ac0d38719915ae169aa6b61fca227b0b7d198d43728f0c879c",
"sha256:a09f98011236a419ee3f49cedc9ef27d7a1651df07810ae430a6b06576e0b414",
"sha256:a5d897c14513590a85774180be713f692df6fa8ecf6483e561a6d47309566f37",
"sha256:ad6f2ff5b1989a4899bf89800a671d71b1612e5ff40866d1f4d8bcf48d4e5764",
"sha256:c42c4b73121caf0ed6cd795512c9c09c52a7287b04d105d112068c1736d7c753",
"sha256:cb1017eec5257e9ac6209ac172058c430e834d5d2bc21961dceeb79d111e5909",
"sha256:d6c7bb82883680e168b55b49c70af29b84b84abb161cbac2800e8fcb6f2109b6",
"sha256:e452dc66e08a4ce642a961f134814258a082832c78c90351b75c41ad16f79f63",
"sha256:e5b6ed0f0b42317050c88022349d994fe72bfe35f5908617512cd8c8ef9da2a9",
"sha256:e9b30d4bd69498fc0c3fe9db5f62fffbb06b8eb9321f92cc970f2969be5e3949",
"sha256:ec149b90019852266fec2341ce1db513b843e496d5a8e8cdb5ced1923a92faab",
"sha256:edb01671b3caae1ca00881686003d16c2209e07b7ef8b7639f1867852b948f7c",
"sha256:f0d3929fe88ee1c155129ecd82f981b8856c5d97bcb0d5f23e9b4242e79d1de3",
"sha256:f29454410db6ef8126c83bd3c968d143304633d45dc57b51252afbd79d700893",
"sha256:fe45becb4c2f72a0907c1d0246ea6449fe7a9e2293bb0e11c4e9a32bb0930a15",
"sha256:fedbd128668ead37f33917820b704784aff695e0019309ad446a6d0b065b57e4"
],
"markers": "python_version >= '3.6'",
"version": "==1.19.4"
},
"packaging": {
"hashes": [
"sha256:05af3bb85d320377db281cf254ab050e1a7ebcbf5410685a9a407e18a1f81236",
"sha256:eb41423378682dadb7166144a4926e443093863024de508ca5c9737d6bc08376"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==20.7"
},
"pint": {
"hashes": [
"sha256:63ccb7153754923fd95477be69dcf8d7d0764ec2ebb3f6945f920c31fdf13392",
"sha256:d43a2e9ae003164978b60fdf8cd920d8581e1a5991df8dded29b00f4850ec83a"
],
"index": "pypi",
"version": "==0.16.1"
},
"pyparsing": {
"hashes": [
"sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1",
"sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"
],
"markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==2.4.7"
},
"scipy": {
"hashes": [
"sha256:168c45c0c32e23f613db7c9e4e780bc61982d71dcd406ead746c7c7c2f2004ce",
"sha256:213bc59191da2f479984ad4ec39406bf949a99aba70e9237b916ce7547b6ef42",
"sha256:25b241034215247481f53355e05f9e25462682b13bd9191359075682adcd9554",
"sha256:2c872de0c69ed20fb1a9b9cf6f77298b04a26f0b8720a5457be08be254366c6e",
"sha256:3397c129b479846d7eaa18f999369a24322d008fac0782e7828fa567358c36ce",
"sha256:368c0f69f93186309e1b4beb8e26d51dd6f5010b79264c0f1e9ca00cd92ea8c9",
"sha256:3d5db5d815370c28d938cf9b0809dade4acf7aba57eaf7ef733bfedc9b2474c4",
"sha256:4598cf03136067000855d6b44d7a1f4f46994164bcd450fb2c3d481afc25dd06",
"sha256:4a453d5e5689de62e5d38edf40af3f17560bfd63c9c5bd228c18c1f99afa155b",
"sha256:4f12d13ffbc16e988fa40809cbbd7a8b45bc05ff6ea0ba8e3e41f6f4db3a9e47",
"sha256:634568a3018bc16a83cda28d4f7aed0d803dd5618facb36e977e53b2df868443",
"sha256:65923bc3809524e46fb7eb4d6346552cbb6a1ffc41be748535aa502a2e3d3389",
"sha256:6b0ceb23560f46dd236a8ad4378fc40bad1783e997604ba845e131d6c680963e",
"sha256:8c8d6ca19c8497344b810b0b0344f8375af5f6bb9c98bd42e33f747417ab3f57",
"sha256:9ad4fcddcbf5dc67619379782e6aeef41218a79e17979aaed01ed099876c0e62",
"sha256:a254b98dbcc744c723a838c03b74a8a34c0558c9ac5c86d5561703362231107d",
"sha256:b03c4338d6d3d299e8ca494194c0ae4f611548da59e3c038813f1a43976cb437",
"sha256:cc1f78ebc982cd0602c9a7615d878396bec94908db67d4ecddca864d049112f2",
"sha256:d6d25c41a009e3c6b7e757338948d0076ee1dd1770d1c09ec131f11946883c54",
"sha256:d84cadd7d7998433334c99fa55bcba0d8b4aeff0edb123b2a1dfcface538e474",
"sha256:e360cb2299028d0b0d0f65a5c5e51fc16a335f1603aa2357c25766c8dab56938",
"sha256:e98d49a5717369d8241d6cf33ecb0ca72deee392414118198a8e5b4c35c56340",
"sha256:ed572470af2438b526ea574ff8f05e7f39b44ac37f712105e57fc4d53a6fb660",
"sha256:f87b39f4d69cf7d7529d7b1098cb712033b17ea7714aed831b95628f483fd012",
"sha256:fa789583fc94a7689b45834453fec095245c7e69c58561dc159b5d5277057e4c"
],
"index": "pypi",
"version": "==1.5.4"
},
"sympy": {
"hashes": [
"sha256:09aa4b3075e505108cb84785ba358e58a53d9596c8c71f07b613958b9150c481",
"sha256:9104004669cda847f38cfd8cd16dd174952c537349dbae740fea5331d2b3a51b"
],
"index": "pypi",
"version": "==1.7"
}
},
"develop": {}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment