Skip to content

节日集合库(FestivalLibrary)

模块: borax.calendars.festivals2

Add in 3.5.0

数据格式

节日库 FestivalLibrary 是由众多节日组成的数据库,可保存为 csv 文件,csv文件格式如下:

<节日编码>,<节日名称>,<节日标签>

<节日编码>,<节日名称>

文件的每一行可代表一个 Festival 对象,依次对应于 code、name、labels三个属性。

例子:

001010,元旦
002140,情人节
003080,妇女节
003120,植树节
004010,愚人节
005010,劳动节

Borax内置节日库

Borax内置了两个节日库,位于 borax.calendars.datasets 包下。

标识 文件 描述 数量 备注
basic FestivalData.csv 基础节日 33 节气节日仅包括清明、冬至两个节日
ext1 festivals_ext1.csv 扩展的节日 343
basic1 FestivalData.csv 在basic基础上多20个节气 55 可用于日历

可使用 FestivalLibrary.load_buitin 加载这些数据。

API

FestivalLibrary 是集合容器类,提供了一些常用的节日。此类继承自 collections.UserList ,拥有 append/remove/extend/insert等方法。

需要注意的是,FestivalLibrary 并不重写这些方法的逻辑,因此如需保证节日不重复,可以使用 extend_unique 方法添加。

class FestivalLibrary(collections.UserList):
    pass

创建一个节日库对象主要有三种方法:

第一,从 borax 提供默认数据加载。

fl = FestivalLibrary.load_builtin('basic') # 加载基础节日库,可选 empty / basic / ext1

第二,从某个 csv 文件加载。

fl = FestivalLibrary.load_file('/usr/amy/festivals/my_festival.csv')

第三,从已有的节日创建新的节日库。

fl1 = FestivalLibrary(fl) # 复制 fl节日库

# 使用函数式编程过滤其中的公历型节日
fl2 = FestivalLibrary(filter(lambda f: f.schema == FestivalSchema.SOLAR, fl)) 

get_code_set

Add in v3.5.1

FestivalLibrary.get_code_set()

获取当前所有节日的code集合。

extend_unique

Add in v3.5.1

FestivalLibrary.extend_unique(other)

添加多个节日对象,类似于 extend 方法,但是如果code已经存在则不再加入。

extend_term_festivals

Add in v4.0.1

FestivalLibrary.extend_term_festivals()

添加24个节气节日。

delete_by_indexes

Add in v4.0.0

FestivalLibrary.delete_by_indexes(indexes:List[int])

按照位置删除多个元素。

load

Add in 4.1.0

FestivalLibrary.load(cls, identifier_or_path: Union[str, Path]) -> 'FestivalLibrary'

加载Borax内部数据或自定义文件。

fl = FestivalLibrary.load('basic')

fl2 = FestivalLibrary.load('/usr/my/my_festivals.csv')

load_file

FestivalLibrary.load_file(cls, file_path: Union[str, Path]) -> 'FestivalLibrary'

从文件 file_path 中加载节日数据。

load_builtin

FestivalLibrary.load_builtin(cls, identifier: str = 'basic') -> 'FestivalLibrary'

加载Borax提供的节日库数据。

get_festival

FestivalLibrary.get_festival(self, name: str) -> Optional[Festival]

根据名称获取对应的 Festival 对象。

get_festival_names

FestivalLibrary.get_festival_names(self, date_obj: MixedDate) -> list

获取某一个日期的节日名称列表。

list_days_in_countdown

Add in 3.5.6

Update in v4.0.0:新增 countdown_ordered 参数。如果为False,按节日原顺序输出。

FestivalLibrary.list_days_in_countdown(countdown: Optional[int] = None, date_obj: MixedDate = None,  countdown_ordered: bool = True
    ) -> List[Tuple[int, WrappedDate, Festival]]

迭代获取某个时间的倒计时信息。

计算节日及其距离今天(2021年5月4日)的天数

from borax.calendars.festivals2 import FestivalLibrary

library = FestivalLibrary.load_builtin()
for ndays, wd, festival in library.list_days_in_countdown(countdown=365):
    print(f'{ndays:>3d} {wd} {festival.name}')

输出结果

  0 2022-05-04(四月初四) 青年节
  4 2022-05-08(四月初八) 母亲节
  8 2022-05-12(四月十二) 护士节
...
332 2023-04-01(闰二月十一) 愚人节
336 2023-04-05(闰二月十五) 清明
362 2023-05-01(三月十二) 劳动节

iter_festival_countdown

Deprecated in 3.5.6: 可使用 list_days_in_countdown 方法。

FestivalLibrary.iter_festival_countdown(self, countdown: Optional[int] = None, date_obj: MixedDate = None) -> Iterator[Tuple[int, List]]

迭代获取节日的日期。

from borax.calendars.festivals2 import FestivalLibrary

fl = FestivalLibrary.load_builtin()
for nday, gd_list in fl.iter_festival_countdown():
    for gd in gd_list:
        print('{:>3d} {} {}'.format(nday, gd.name, gd))

输出

  7 儿童节 2021-06-01(四月廿一)
 20 端午节 2021-06-14(五月初五)
 26 父亲节 2021-06-20(五月十一)
...
344 青年节 2022-05-04(四月初四)
348 母亲节 2022-05-08(四月初八)
352 护士节 2022-05-12(四月十二)

iter_month_daytuples

Updated in 3.5.5: 新增 return_pos 参数

Added in 3.5.2

FestivalLibrary.iter_month_daytuples(year: int, month: int, firstweekday: int = 0, return_pos:bool = False)

迭代返回公历月份(含前后完整日期)中每个日期信息,每个日期格式为 (公历日, 农历日中文或节日, WrappedDate对象)

如果 return_pos 设置为 True,则返回 (公历日, 农历日中文或节日, WrappedDate对象, 行序号, 列序号)

例子

import pprint
from borax.calendars.festivals2 import FestivalLibrary

library = FestivalLibrary.load_builtin()
days = list(library.iter_month_daytuples(2022,1, return_pos=True))
pprint.pprint(days)

输出结果

[(0, '', None, 0, 0),
 (0, '', None, 0, 1),
 (0, '', None, 0, 2),
 (0, '', None, 0, 3),
 (0, '', None, 0, 4),
 (1, '元旦', <WrappedDate:2022-01-01(二〇二一年冬月廿九)>, 0, 5),
 (2, '三十', <WrappedDate:2022-01-02(二〇二一年冬月三十)>, 0, 6),
 (3, '十二月', <WrappedDate:2022-01-03(二〇二一年腊月初一)>, 1, 0),
 (4, '初二', <WrappedDate:2022-01-04(二〇二一年腊月初二)>, 1, 1),
 (5, '小寒', <WrappedDate:2022-01-05(二〇二一年腊月初三)>, 1, 2),
 (6, '初四', <WrappedDate:2022-01-06(二〇二一年腊月初四)>, 1, 3),
 (7, '初五', <WrappedDate:2022-01-07(二〇二一年腊月初五)>, 1, 4),
 (8, '初六', <WrappedDate:2022-01-08(二〇二一年腊月初六)>, 1, 5),
 (9, '初七', <WrappedDate:2022-01-09(二〇二一年腊月初七)>, 1, 6),
 (10, '腊八节', <WrappedDate:2022-01-10(二〇二一年腊月初八)>, 2, 0),
 (11, '初九', <WrappedDate:2022-01-11(二〇二一年腊月初九)>, 2, 1),
 (12, '初十', <WrappedDate:2022-01-12(二〇二一年腊月初十)>, 2, 2),
 (13, '十一', <WrappedDate:2022-01-13(二〇二一年腊月十一)>, 2, 3),
 (14, '十二', <WrappedDate:2022-01-14(二〇二一年腊月十二)>, 2, 4),
 (15, '十三', <WrappedDate:2022-01-15(二〇二一年腊月十三)>, 2, 5),
 (16, '十四', <WrappedDate:2022-01-16(二〇二一年腊月十四)>, 2, 6),
 (17, '十五', <WrappedDate:2022-01-17(二〇二一年腊月十五)>, 3, 0),
 (18, '十六', <WrappedDate:2022-01-18(二〇二一年腊月十六)>, 3, 1),
 (19, '十七', <WrappedDate:2022-01-19(二〇二一年腊月十七)>, 3, 2),
 (20, '大寒', <WrappedDate:2022-01-20(二〇二一年腊月十八)>, 3, 3),
 (21, '十九', <WrappedDate:2022-01-21(二〇二一年腊月十九)>, 3, 4),
 (22, '二十', <WrappedDate:2022-01-22(二〇二一年腊月二十)>, 3, 5),
 (23, '廿一', <WrappedDate:2022-01-23(二〇二一年腊月廿一)>, 3, 6),
 (24, '廿二', <WrappedDate:2022-01-24(二〇二一年腊月廿二)>, 4, 0),
 (25, '廿三', <WrappedDate:2022-01-25(二〇二一年腊月廿三)>, 4, 1),
 (26, '廿四', <WrappedDate:2022-01-26(二〇二一年腊月廿四)>, 4, 2),
 (27, '廿五', <WrappedDate:2022-01-27(二〇二一年腊月廿五)>, 4, 3),
 (28, '廿六', <WrappedDate:2022-01-28(二〇二一年腊月廿六)>, 4, 4),
 (29, '廿七', <WrappedDate:2022-01-29(二〇二一年腊月廿七)>, 4, 5),
 (30, '廿八', <WrappedDate:2022-01-30(二〇二一年腊月廿八)>, 4, 6),
 (31, '除夕', <WrappedDate:2022-01-31(二〇二一年腊月廿九)>, 5, 0),
 (0, '', None, 5, 1),
 (0, '', None, 5, 2),
 (0, '', None, 5, 3),
 (0, '', None, 5, 4),
 (0, '', None, 5, 5),
 (0, '', None, 5, 6)]

monthdaycalendar

Added in 3.5.2

FestivalLibrary.monthdaycalendar(year: int, month: int, firstweekday: int = 0)

返回二维列表,每一行表示一个星期。逻辑同iter_month_daytuples

to_csv

Add in 3.5.6

FestivalLibrary.to_csv(path_or_buf)

保存到 csv 文件。

filter_inplace

Add in 4.0.0

FestivalLibrary.filter_(**kwargs)

按条件过滤节日,保留符合参数条件的节日,返回实例本身。

可用的参数条件

参数名称 参数值类型 描述
schema int 节日类型值
schema__in List[int] 多个节日类型值
catalog str 节日分类标签
catalog__in List[str] 多个节日分类标签
name str 名称,精确匹配
name__in List[str] 多个名称
name__contains str 节日名称,模糊匹配
description str 节日描述
description__contains str 节日描述,模糊匹配

exclude_inplace

Add in 4.0.0

FestivalLibrary.exclude_(**kwargs)

按条件过滤节日,符合参数条件的节日将会被删除,返回实例本身。

filter_

按条件过滤节日条目,保留符合参数条件的节日,返回新的 FestivalLibray 实例。

exclude_

按条件过滤节日,符合参数条件的节日将会被删除,返回新的 FestivalLibray 实例。

sort_by_countdown

Add in 4.0.0

FestivalLibrary.sort_by_countdown(reverse=False)

按照距离今天的倒计天数 原地排序,返回实例本身。