def find_astro(year): ''' find new moons and solar terms needed for calculate lunar calendar Arg: year is a integer Return: list of dictionaries [ {date, newmoon/angle, placeholder for month }, ... ] ''' # find all solar terms from -120 to +270 degree, negative angle means # search backward from Vernal Equinox solarterms = [] angle = -120 while angle <= 270: jdst = solarterm(year, angle) solarterms.append([jdst, angle]) #print angle, jdftime(jdst, tz=8, ut=True) angle += 15 # search 15 newmoons start 30 days before last Winter Solstice nms = findnewmoons(solarterms[1][0] - 30) aadays = [[x, 'newmoon'] for x in nms] aadays.extend(solarterms) aadays.sort() # normalize all Julian Day to midnight for later compare aadays = [(jdptime(jdftime(d[0], '%y-%m-%d', tz=8, ut=True), '%y-%m-%d'), d[1]) for d in aadays] astro = [{'date': d[0], 'astro': d[1], 'month': None} for d in aadays] return astro
def cn_lunarcal(year): ''' to generate lunar calendar for year, the search should started from previous Winter Solstice to next year's Winter Solstic. Because there might be a leap month after this Winter Solstic, which can only be found by compute Calendar of next year, for example, 2033 has a leap 11 that belongs to the next year. Calendar for this and next year are computed and combined, then trim to fit into scale of this year. ''' cal0 = search_lunarcal(year) cal1 = search_lunarcal(year + 1) for k, v in cal1.iteritems(): cal0[k] = v start = jdptime('%s-%s-%s' % (year, 1, 1), '%y-%m-%d') end = jdptime('%s-%s-%s' % (year, 12, 31), '%y-%m-%d') lc = [] for jd, day in cal0.iteritems(): day['date'] = jdftime(jd, '%y-%m-%d', ut=False) if jd >= start and jd <= end: lc.append((jd, day)) lc.sort() res = [x[1] for x in lc] return res