我到处用谷歌搜索都没找到这个。我工作的零售客户端使用的是NRFretail日历。NRF site Calendars我想知道是否有人用这些值创建过查找/维度表。
谢谢,
发布于 2012-07-07 02:45:35
您可以在CPAN上找到一个perl模块,它可以生成任何年份的Retail4-5-4日历:http://metacpan.org/pod/DateTime::Fiscal::Retail454
它是专门为这个问题编写的。
发布于 2012-11-23 12:17:20
我过去使用的一个算法选项是(我在Excel中解释如下):
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年左右的“闰周”
发布于 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日历是公布的-请参阅上面的链接。
这听起来像是您试图将它们用作星型模式数据仓库的维度?您是否正在寻求实现该功能的建议?
今天晚上我真的应该做一些真正的工作
******************* 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年
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]https://stackoverflow.com/questions/7015724
复制相似问题