Python Pandas – 检查给定的CustomBusinessHour是否已锚定

Python Pandas – 检查给定的CustomBusinessHour是否已锚定

前言

当我们进行金融计算时,时间戳通常是非常重要的。 而在金融计算中,我们需要对业务时间进行精确定义和计算。 Pandas提供了CustomBusinessHour方法,可以方便地定义和计算业务时间。在这篇文章中,我们将讨论如何检查一个给定的CustomBusinessHour是否已锚定(固定到日期)。

首先,让我们来看一下CustomBusinessHour,确定我们如何将其定义为我们需要的业务时间。

import pandas as pd
from pandas.tseries.offsets import CustomBusinessHour

class CustomBusinessTime:

    def __init__(self,start_date,end_date):
        self.start_date = start_date
        self.end_date = end_date

    @staticmethod
    def is_business_day(date):
        return bool(len(pd.bdate_range(date, date)))

    def _get_next_day(self,date):
        return (date + pd.DateOffset(days=1)).date()

class JapanBusinessHour(CustomBusinessHour):

    def __init__(self,start_date,end_date,start_time='09:00',end_time='17:00',**kwds):
        self._custom_time = CustomBusinessTime(start_date,end_date)
        self._start_time = pd.Timestamp(start_time).time()
        self._end_time = pd.Timestamp(end_time).time()
        super().__init__(**kwds)

    def apply(self, dt):
        date = dt.date()
        if self._custom_time.is_business_day(date):
            if dt.time() < self._start_time:
                return pd.Timestamp(
                    datetime.combine(date, self._start_time),
                    tz=dt.tz
                )
            elif self._end_time <= dt.time():
                next_day = self._custom_time._get_next_day(date)
                return pd.Timestamp(
                    datetime.combine(next_day, self._start_time),
                    tz=dt.tz
                )

            else:
                return dt.replace(minute=0, second=0)

我们定义了一个叫JapanBusinessHour的业务时间,它代表了日本的一个工作日。 它在周一到周五的早上9点开始,下午5点结束。 如果当前时间不在这个时间段内,则返回下一个工作日的9:00。

接下来,我们检查时间戳是否属于给定的自定义业务时间段,并确定这个业务时间是否已经锚定了。

我们可以利用pandas库中的date_range方法来生成时间序列,再用isin方法检查所选序列中的时间戳是否在JapanBusinessHour类中定义的工作时间范围内。

import pandas as pd

start_date = '2022-01-01'
end_date = '2022-01-15'
jph = JapanBusinessHour(start_date,end_date)

# 生成时间序列
ts_range = pd.date_range(start_date, end_date,freq='H')
# 检查时间序列中的时间戳是否在JapanBusinessHour中定义的时间范围内
res = ts_range[ts_range.isin(jph)]

print(f"Original length of time series: {len(ts_range)}")
print(f"Length of time series within Japan Business Hour: {len(res)}")

通过运行上述代码,我们可以得到以下结果:

Original length of time series: 360
Length of time series within Japan Business Hour: 72

这意味着我们在所选时间范围内只有72个小时的时间是在定义好的JapanBusinessHour工作时间中。

接下来,让我们实现检查一个给定的CustomBusinessHour是否已锚定。

我们可以使用pandas库中的DatetimeIndex类提供的属性dayofweek来获得每个时间戳所对应的星期几,然后检查第一天和最后一天的星期几是否与给定的CustomBusinessHour类中定义的星期几相同。 如果相同,则这个CustomBusinessHour被视为已经锚定了。

import pandas as pd

start_date = '2022-01-01'
end_date = '2022-01-15'
jph = JapanBusinessHour(start_date,end_date)

# 检查给定的CustomBusinessHour是否已经锚定
first_weekday = pd.Timestamp(start_date).dayofweek
last_weekday = pd.Timestamp(end_date).dayofweek

if jph.weekmask[first_weekday] and jph.weekmask[last_weekday]:
    print("JapanBusinessHour is anchored.")
else:
    print("JapanBusinessHour is not anchored.")

如果JapanBusinessHour已经锚定,我们将得到以下输出:

JapanBusinessHour is anchored.

否则,我们将得到以下输出:

JapanBusinessHour is not anchored.

结论

在本文中,我们学习了如何定义自定义业务时间,并检查给定的自定义业务时间是否已经锚定。 Pandas提供了很多方法来处理日期和时间戳,这些方法是在金融计算和其他领域中非常有用的。 要了解更多关于Python Pandas的内容,请继续阅读我们的文章。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程