有没有Python3可用的农历转公历的包?

我想写个小脚本,内容是把一年中是周末且周末是在新月那几天(农历 27-3 日),但是现在找不到公历转农历的包,之前的工作如下:

#生成一个一年的日历

df = pd.DataFrame(pd.date_range(start='2017-01-01',end='2017-12-31'),columns=['公历'])

df = df.set_index(keys='公历')

#找出所有周末

df['星期几'] = df.index.weekday + 1

Sat = df['星期几'] == 6

Sun = df['星期几'] == 7

#找出国庆节,别的节太短或者和周末都挨着

National_Day = df['2017-10-01':'2017-10-07']

new_df = pd.concat([df[Sat | Sun],National_Day])

df2 = df.ix[new_df.sort_index().index.drop_duplicates()]

下一步就该找出这个日历的农历了,有没有人教教我怎么做?

pypi 上有个 lunarsolarcovter 是 py2 用的,我用不了


有没有Python3可用的农历转公历的包?

6 回复

LunarSolarConverter 就 200 行代码,你自己改一下不就完了


有,lunardate 这个包可以。用 pip install lunardate 安装。

它主要做公历转农历,但反向转换(农历转公历)也能通过推算实现。给你个例子:

from lunardate import LunarDate

# 假设是农历2023年闰二月十五
ld = LunarDate(2023, 2, 15, isleap=True) # isleap 表示是否是闰月
# 直接转成公历date对象
solar_date = ld.toSolarDate()
print(solar_date) # 输出: 2023-04-05

# 再举个非闰月的例子,农历2023年正月初一
ld2 = LunarDate(2023, 1, 1)
print(ld2.toSolarDate()) # 输出: 2023-01-22

核心就是这个 LunarDate 类,初始化时传入农历年、月、日和 isleap 参数,然后调用 toSolarDate() 方法就得到公历的 datetime.date 对象。

注意月份和日期都是整数,isleap 是布尔值。这个包覆盖的年份范围挺广的,一般够用。

总结:用 lunardate

标题是农转公,正文是公转农,要哪个?


!/usr/bin/env python3
# -- coding: utf-8 --

# lunar.py
# 2015/02/27 罗兵

google 这个能找到

公转农, github 搜到了,谢谢

之前只想着从 pypi 下载,没仔细看他内容,我以为会有别的时间包也能实现呢

有啊,你可以试一下 sxtwl,pip install sxtwl

import sxtwl

#日历中文索引
ymc = [u"十一", u"十二", u"正", u"二", u"三", u"四", u"五", u"六", u"七", u"八", u"九", u"十" ]
rmc = [u"初一", u"初二", u"初三", u"初四", u"初五", u"初六", u"初七", u"初八", u"初九", u"初十",
u"十一", u"十二", u"十三", u"十四", u"十五", u"十六", u"十七", u"十八", u"十九",
u"二十", u"廿一", u"廿二", u"廿三", u"廿四", u"廿五", u"廿六", u"廿七", u"廿八", u"廿九", u"三十", u"卅一"]


lunar = sxtwl.Lunar() #实例化日历库

#阴历转阳历
day = lunar.getDayByLunar(2030, 3, 27 , False)

print u"公历:", day.y, u"年", day.m, u"月", day.d, u"日"
if day.Lleap:
print u"阴历:润", ymc[day.Lmc], u"月", rmc[day.Ldi], u"日"
else:
print u"阴历:", ymc[day.Lmc], u"月", rmc[day.Ldi], u"日"



#同理,阳历转阴历

day = lunar.getDayBySolar(2018, 10, 20)
print u"公历:", day.y, u"年", day.m, u"月", day.d, u"日"
if day.Lleap:
print u"阴历:润", ymc[day.Lmc], u"月", rmc[day.Ldi], u"日"
else:
print u"阴历:", ymc[day.Lmc], u"月", rmc[day.Ldi], u"日"

回到顶部