Search code examples
pythonastronomyskyfield

Calculating time of visual appearance of moon after new moon with Skyfield


I am currently trying to implement a reconstruction of the ancient Germanic calendar in Python. One of its rules is that if a new moon occurs in the 12 nights following the winter solstice, the next year will be a leap year (with a leap month added to it). I could easily implement this with the almanac module of Skyfield.

For most of the years this worked perfect. But my algorith calculated that 2034, 2060, 2061 were leap years, which the book I use as reference ("The Lunisolar Calendar of the Germanic Peoples" by Andreas E. Zautner) states aren't. It turned out that in the years preceding these either the new moon occured directly after the winter solstice or slighty after the 12 nights. Therefore the new moons that the book references seem to occur slighty later than the actual ones. I found out that the definition of a new moon used to be different: The new moon is the point in time, where the crescent moon is visible for the first time.

Is there a way of calculating the new moon after this definition using Skyfield? Is it even well-defined enough to be calculated, since the ability to see this very thin line of light can differ between people and, more importantly, different observation equipment which have different sensitivities?


Solution

  • You are asking a very hard question without realizing it. The question you're asking is about an "observational calendar" rather than an "astronomical calendar": a new month occurs when someone witnesses the new moon rather than the astronomical moment of newness.

    Because there are human factors involved, this is hard to quantify exactly. It is still an issue with the Islamic calendar today, because each Islamic community relies on witnesses to testify that they have seen the new moon. How dim can human eyes see? How clear is the atmosphere? How far away is the moon from the earth? Must the observation be made near you, or will you accept an observation from several hours and time zones away?

    With observational calendars, it really is impossible to predict the future of the calendar. When you are attempting to re-create a dead observational calendar and project it into the future, you just have to realize that there are going to be uncertainties.

    The term "proleptic calendar" means taking a calendar and using it for dates before that calendar existed. I don't know the term for using a calendar beyond when it ceased to exist.


    Continuing to maybe answer your question. The best advice I can give you is to use the Islamic calendar. Its calculation of the first of the month is roughly the same as what you want.

    I use the calendrical package, which you can access via pip install python-calendrical. It provides functions such as islamic_to_rd, rd_to_islamic, gregorian_to_rd, rd_to_gregorian. (It has other calendars, too.). Use gregorian_to_rd(year, month, day) to get the number of days since the proleptic January 1, 1AD). You can then use rd_to_islamic(value) to convert that into the Islamic date. If it's the first of the month, then it's your first of the month, too.

    The source is there, too.