SQLAlchemy 混合属性日期时间到假期

Posted

技术标签:

【中文标题】SQLAlchemy 混合属性日期时间到假期【英文标题】:SQlAlchemy hybrid property datetime to holidays 【发布时间】:2021-01-24 07:11:49 【问题描述】:

我有一个如下所示的 SQLAlchemy 模型。

class ElUsage(Base):
    recid = Column(Integer(),primary_key=True)
    date_of_usage = Column(DATE())
    total_units = Column(Float(precision=5))

我试图通过将日期与 pandas 日历进行比较来创建混合属性 is_holiday

@hybrid_property
def is_holiday(self):
    is_hday = 0
    cal = calendar()
    holidays = cal.holidays(start=dt.date(2015,1,1),
                            end=dt.date(2020,12,31))
    if np.datetime64(self.usage_date) in holidays:
        is_hday = 1
    
    return is_hday

@is_holiday.expression
def is_holiday(cls):
    is_hday = 0
    cal = calendar()
    holidays = cal.holidays(start=dt.date(2015,1,1),
                            end=dt.date(2020,12,31))
    
    if np.datetime64(cls.usage_date) in holidays:
        is_hday = 1
    
    return is_hday

显式转换为 numpy datetime64 是一项挑战。创建混合属性以将日期标记为假日或非(0 或 1)值的任何简单方法?

TIA

【问题讨论】:

【参考方案1】:

第一个属性 - python 部分 - 你做得对,考虑到this answer。

@hybrid_property
def is_holiday(self):
    is_hday = 0
    cal = calendar()
    holidays = cal.holidays(start=dt.date(2015,1,1),
                            end=dt.date(2020,12,31))
    if np.datetime64(self.usage_date) in holidays:
        is_hday = 1
    
    return is_hday

第二部分 - SQL 部分 - 更复杂,因为您需要编写返回等效属性的 SQLAlchemy 查询

@is_holiday.expression
def is_holiday(cls):
    cal = calendar()
    holidays = cal.holidays(start=dt.date(2015,1,1),
                            end=dt.date(2020,12,31))
    return cls.usage_date.in_(holidays)

我无法对此进行测试,所以如果它不起作用,请告诉我。

【讨论】:

感谢您的解决方案。它按预期工作。

以上是关于SQLAlchemy 混合属性日期时间到假期的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SqlAlchemy / Mysql 中存储时区感知日期时间值?

SQLAlchemy 计算列

SQLAlchemy - 将日期时间设置为字符串并获取日期?

在访问中提取一系列日期并跳过假期

无法导入名称'日期时间'python烧瓶sqlalchemy

在 SQLAlchemy 中创建混合属性的自定义元类