首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >4-5-4 National Retail foundation Calendar csv下载或创建函数

4-5-4 National Retail foundation Calendar csv下载或创建函数
EN

Stack Overflow用户
提问于 2011-08-11 02:18:00
回答 5查看 8.5K关注 0票数 5

我到处用谷歌搜索都没找到这个。我工作的零售客户端使用的是NRFretail日历。NRF site Calendars我想知道是否有人用这些值创建过查找/维度表。

谢谢,

EN

回答 5

Stack Overflow用户

发布于 2012-07-07 02:45:35

您可以在CPAN上找到一个perl模块,它可以生成任何年份的Retail4-5-4日历:http://metacpan.org/pod/DateTime::Fiscal::Retail454

它是专门为这个问题编写的。

票数 4
EN

Stack Overflow用户

发布于 2012-11-23 12:17:20

我过去使用的一个算法选项是(我在Excel中解释如下):

  • 从日期中计算出weeknum (在1到53范围内)
  • 从weeknum中计算出期间数字(在1到12范围内)为:

1+ 'one-based 3*(INT((weeknum-1)/13))+‘如果(MOD(weeknum-1,13)>3,1,0)+’从13周季度内的第一周开始如果(MOD(weeknum-1,13)>8,1,0)+‘调整中间块中的周如果(weeknum>52,-1,0)’和最后一个块中的周IF(weeknum>52,-1,0)‘并处理每隔6年左右的“闰周”

票数 3
EN

Stack Overflow用户

发布于 2011-08-11 02:47:39

请参阅http://www.nrf.com/modules.php?name=Documents&op=viewlive&sp_id=6019

4-5-4或4-4-5日历用于从一年到一年提供一致的月份长度,因此1月份不是从1月1日至31日报告每月销售额,而是从比方说周日开始到周六结束。这样,一个月中的周末数量总是一致的,假日也不会移动,这使得每年的月度销售比较都是可行的

有许多幕后摆弄,但4-5-4日历是公布的-请参阅上面的链接。

这听起来像是您试图将它们用作星型模式数据仓库的维度?您是否正在寻求实现该功能的建议?

今天晚上我真的应该做一些真正的工作

代码语言:javascript
复制
******************* Feb06
[[29, 30, 31, 1, 2, 3, 4],
 [5, 6, 7, 8, 9, 10, 11],
 [12, 13, 14, 15, 16, 17, 18],
 [19, 20, 21, 22, 23, 24, 25]]
******************* Mar06
[[26, 27, 28, 1, 2, 3, 4],
 [5, 6, 7, 8, 9, 10, 11],
 [12, 13, 14, 15, 16, 17, 18],
 [19, 20, 21, 22, 23, 24, 25],
 [26, 27, 28, 29, 30, 31, 1]]
******************* Apr06
[[2, 3, 4, 5, 6, 7, 8],
 [9, 10, 11, 12, 13, 14, 15],
 [16, 17, 18, 19, 20, 21, 22],
 [23, 24, 25, 26, 27, 28, 29]]

上面的内容似乎是正确的,对比NRF的日历

它来自下面的怪物,但它可能会帮助你做15年

代码语言:javascript
复制
import calendar
calendar.setfirstweekday(calendar.SUNDAY)
import datetime
import pprint


def addweek(yr):
    d = datetime.date(yr, 12, 31)
    if d.weekday() in (6,0,1):
        return True
    else:
        return False

def printday(d):
    print d.day,
    if d.weekday() == 5:
        print


def wksinthismth(cal):
    seq = [len(mth) for mth in cal]
    #print "seq", seq

    #special - but really need dates in cal
    if (len(seq) % 11 == 0 ) and len(seq) != 0 and addweek(2006):

        return 5

    try:
        lenlastmth = seq[-1]
    except:
        #print "fail4"
        return 4

    try:
        lenprevmth = seq[-2:-1][0]
    except:
        #print "fail5"
        return 5

    try:
        lenprevprevmth = seq[-3:-2][0]
    except:
        lenprevprevmth = 4


    if lenprevmth == []:return 5

    if  (lenlastmth == 4 and lenprevmth == 5 and lenprevprevmth == 5):
        #long january just passed
        return 5

    #print lenlastmth, lenprevmth
    if (lenlastmth == 4 and lenprevmth == 4) :
        #print "ok5"
        return 5
    else:
        #print "ok4"
        return 4

oneday = datetime.timedelta(days=1)
startdate = datetime.date(2006,1,29)
thisdate = startdate
cal = []
thismth = []
thiswk = []

for i in range(800):
    thiswk.append(thisdate.day)
    if thisdate.weekday() == 5: #week over, decide how format it
        wks = wksinthismth(cal)
        if len(thismth) <= wks-1:
            thismth.append(thiswk)
        else:
            cal.append(thismth)
            thismth = []
            thismth.append(thiswk)
        thiswk = []

    thisdate += oneday

mthslist = ['Feb06',
'Mar06',
'Apr06',
'May06',
'Jun06',
'Jul06',
'Aug06',
'Sept06',
'Oct06',
'Nov06',
'Dec06',
'Jan07',
'Feb07',
'Mar07',
'Apr07',
'May07',
'Jun07',
'Jul07',
'Aug07',
'Sept07',
'Oct07',
'Nov07',
'Dec07',
'Jan08',
'Feb08',
'Mar08',
'Apr08',
'May08',
'Jun08',
'Jul08',
'Aug08',
'Sept08',
'Oct08',
'Nov08',
'Dec08',
]
i = 0
for mth in cal:
    print "*******************", mthslist[i]
    pprint.pprint(mth)
    i += 1


# start week on Sun
# if 31 dec is S M T then add week in Jan
print [len(mth) for mth in cal]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7015724

复制
相关文章

相似问题

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