首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用python创建4-4-5会计日历?

如何使用python创建4-4-5会计日历?
EN

Stack Overflow用户
提问于 2021-04-09 16:16:00
回答 2查看 527关注 0票数 4

我希望有一个数据帧,由相应的周数字和月份组成,每个日期从1/1/21到31/12/50将属于。例如,

代码语言:javascript
复制
  date  |   day   | week_no | yyyy-mm | quarter
01/01/21| Friday  |    40   | 2021-01 | Q4 2021
02/01/21| Saturday|    40   | 2021-01 | Q4 2021
.
.
24/01/21| Sunday  |    44   | 2021-02 | Q4 2021
.
.
01/04/21| Thursday|    53   | 2021-03 | Q4 2021
.
04/04/21| Sunday  |    1    | 2021-04 | Q1 2022

我在Pandas中找到了一个名为FY5253Quarter的包装器类,在python中找到了一个名为fiscal445的包装器类,然而,我不确定如何使用这个类来实现我所需要的。提前感谢您的帮助:)

EN

回答 2

Stack Overflow用户

发布于 2021-04-11 18:55:55

创建日程表可以用SQL来完成。下面是使用PostgreSQL的示例:

代码语言:javascript
复制
WITH RECURSIVE cte AS (
   SELECT CAST('2021-01-01' AS date) d
   UNION ALL
   SELECT d+1
   FROM cte
   WHERE d < CAST('2030-12-31' AS DATE)
)
SELECT 
  d AS "date",
  to_char(d, 'DAY') AS day,
  to_char(d, 'iw') AS week_no,
  to_char(d, 'yyyy-mm') AS "yyyy-mm",
  to_char(d, '"Q"q yyyy') AS "quarter"
FROM cte;

它的工作原理:

  1. 递归部分从2021-01-01生成日期行到定义的结束日期
  2. 主查询生成具有正确字符串格式的列

现在,如果需要,可以使用CREATE TABLE myCalendar AS ...实现查询。

如果您使用的是不同的RDBMS,那么模式基本上是相同的-唯一的区别是使用方言特定的函数。

例如,PostgreSQL有自己的函数generate_series

代码语言:javascript
复制
SELECT * /* format functions here */
FROM generate_series(date '2021-01-01', date '2030-12-31', '1 day');

编辑:

我如何指定我想要一个4-4-5日历,因为根据我的理解,您似乎正在创建一个普通日历?

是的,这是普通的日历。逻辑可以重写,但您已经找到了一个有效的解决方案。

此外,我还找到了4-4-5财年github.com/sqlsunday/calendar/blob/boss/CalendarFunctions.sql的PostgreSQL链接,但在运行function Calendar.Fiscal_4_4_5的脚本时总是遇到错误

重点是它是在TSQL中作为表值函数为SQL Server编写的。要调用它,请使用:

代码语言:javascript
复制
SELECT *
FROM  Calendar.Fiscal_4_4_5 ('2021-01-01', '2030-12-31', '2021-01-01','445',1);
票数 1
EN

Stack Overflow用户

发布于 2021-04-16 03:57:03

好的,再试一次。我喜欢学习新的东西,所以谢谢你把4-4-5财政日历带到我的生活中。;)

因为我认为你只需要创建这个日历一次,然后使用完成的日历作为参考,我想到了一个愚蠢的想法来创建这样一个日历。硬编码循环。

下面的代码有一个函数,它根据开始日期和应该创建的年数创建一个4-4-5会计日历。根据维基百科的说法,每5年或6年有一次闰周,所以我添加了leap_week_year,让您选择leep周应该在哪一年开始。还有一个leap_week_quarter,用于选择哪个季度应为4-4-6。

代码语言:javascript
复制
import pandas as pd
import datetime as dt


def create_445_calender(start_date: str, years: int, leap_week_year = 5, leap_week_quarter = 4):

    output = []

    tmp_datetime = dt.datetime.strptime(start_date,'%d/%m/%Y')
    
    for year in range(1,years+1):
        month_of_year = 1
        week_of_year = 1
        # 4 quarters
        for quarters in range(1,5):
            # 4 weeks
            for weeks in range(1,5):
                # 7 days
                for days in range(1,8):
                    tmp_datestr = dt.datetime.strftime(tmp_datetime,'%d/%m/%Y')
                    tmp_weekday = dt.datetime.strftime(tmp_datetime,'%A')
                    tmp_monthstr = str(month_of_year) if month_of_year >=  10 else '0' + str(month_of_year)
                    tmp_yyyy_mm = dt.datetime.strftime(tmp_datetime,'%Y') + '-' + tmp_monthstr
                    tmp_quarter = 'Q' + str(quarters) + ' ' + dt.datetime.strftime(tmp_datetime,'%Y')
                    output.append([tmp_datestr,tmp_weekday, week_of_year, tmp_yyyy_mm, tmp_quarter])
                    tmp_datetime = tmp_datetime + dt.timedelta(days=1)
                week_of_year += 1
            month_of_year += 1
            # 4 weeks
            for weeks in range(1,5):
                # 7 days
                for days in range(1,8):
                    tmp_datestr = dt.datetime.strftime(tmp_datetime,'%d/%m/%Y')
                    tmp_weekday = dt.datetime.strftime(tmp_datetime,'%A')
                    tmp_monthstr = str(month_of_year) if month_of_year >=  10 else '0' + str(month_of_year)
                    tmp_yyyy_mm = dt.datetime.strftime(tmp_datetime,'%Y') + '-' + tmp_monthstr
                    tmp_quarter = 'Q' + str(quarters) + ' ' + dt.datetime.strftime(tmp_datetime,'%Y')
                    output.append([tmp_datestr,tmp_weekday, week_of_year, tmp_yyyy_mm, tmp_quarter])
                    tmp_datetime = tmp_datetime + dt.timedelta(days=1)
                week_of_year += 1
            month_of_year += 1
            # 5 / 6 weeks
            # 5 years
            if (year % leap_week_year == 0 ) and (quarters == leap_week_quarter):
                tmp_weeks = 6
            else:
                tmp_weeks = 5
            for weeks in range(1,tmp_weeks+1):
                # 7 days
                for days in range(1,8):
                    tmp_datestr = dt.datetime.strftime(tmp_datetime,'%d/%m/%Y')
                    tmp_weekday = dt.datetime.strftime(tmp_datetime,'%A')
                    tmp_monthstr = str(month_of_year) if month_of_year >=  10 else '0' + str(month_of_year)
                    tmp_yyyy_mm = dt.datetime.strftime(tmp_datetime,'%Y') + '-' + tmp_monthstr
                    tmp_quarter = 'Q' + str(quarters) + ' ' + dt.datetime.strftime(tmp_datetime,'%Y')
                    output.append([tmp_datestr,tmp_weekday, week_of_year, tmp_yyyy_mm, tmp_quarter])
                    tmp_datetime = tmp_datetime + dt.timedelta(days=1)
                week_of_year += 1
            month_of_year += 1

    df = pd.DataFrame(output,columns = ['date','day','week_no','yyyy-mm','quarter'])

    return df


my445calender = create_445_calender('06/04/2020', 6, 5, 4)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67017473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档