我希望有一个数据帧,由相应的周数字和月份组成,每个日期从1/1/21到31/12/50将属于。例如,
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的包装器类,然而,我不确定如何使用这个类来实现我所需要的。提前感谢您的帮助:)
发布于 2021-04-11 18:55:55
创建日程表可以用SQL来完成。下面是使用PostgreSQL的示例:
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;它的工作原理:
2021-01-01生成日期行到定义的结束日期现在,如果需要,可以使用CREATE TABLE myCalendar AS ...实现查询。
如果您使用的是不同的RDBMS,那么模式基本上是相同的-唯一的区别是使用方言特定的函数。
例如,PostgreSQL有自己的函数generate_series
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编写的。要调用它,请使用:
SELECT *
FROM Calendar.Fiscal_4_4_5 ('2021-01-01', '2030-12-31', '2021-01-01','445',1);发布于 2021-04-16 03:57:03
好的,再试一次。我喜欢学习新的东西,所以谢谢你把4-4-5财政日历带到我的生活中。;)
因为我认为你只需要创建这个日历一次,然后使用完成的日历作为参考,我想到了一个愚蠢的想法来创建这样一个日历。硬编码循环。
下面的代码有一个函数,它根据开始日期和应该创建的年数创建一个4-4-5会计日历。根据维基百科的说法,每5年或6年有一次闰周,所以我添加了leap_week_year,让您选择leep周应该在哪一年开始。还有一个leap_week_quarter,用于选择哪个季度应为4-4-6。
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)https://stackoverflow.com/questions/67017473
复制相似问题