我的公司使用会计日历,每周从周六开始。 根据 JSL WEEKOFYEAR() 函数,我们有两个选项:规则 1 和 2 表示从星期日开始的周,以及规则 3 表示从星期一开始的周。
是否有人创建了 JMP 脚本来计算以星期日或星期一以外的日期开始的周的一年中的第几周?
抱歉延迟回复。 您的解决方案效果很好。 谢谢。
只是为了确保解决方案是明确的,
@tx尼尔森写道:
很好,这是一个简单的解决方案
Names Default To Here( 1 );
testdate = Date MDY( 12, 31, 2017 );
Week Of Year( testdate + If( Year( testdate ) == Year( testdate + In Days( 1 ) ), In Days( 1 ), 0 ) );
通过使用 In Days(1) 函数向 testdate 添加 1 天,星期日 = 2,星期一 = 3,... 星期五 = 7,星期六又回到 1,因为一周中没有第 8 天。
我还喜欢您可以在公式中定义变量。 很有帮助!
很好,这是一个简单的解决方案
Names Default To Here( 1 );
testdate = Date MDY( 12, 31, 2017 );
Week Of Year( testdate + If( Year( testdate ) == Year( testdate + In Days( 1 ) ), In Days( 1 ), 0 ) );
我刚刚注意到计算似乎在年底崩溃了。
在今年的示例中,2017 年 9 月 30 日是第 41 周的开始。从星期六开始的所有其他周都正确递增到 12/30/17,即第 54 周的开始。
由于某种原因,JMP 没有在接下来的 6 天内继续第 54 周,或者跳过第 54 周并开始第 1 周,而是将 12/30 星期六标记为 2018 年第 54 周,将 12/31 星期日标记为 2018 年第一周的第一天。看起来像是一个缺陷,因为数据集上的几周不应该在不同的两天开始?
我需要添加一个 if 循环将所有第 54 周的数据更改为第 1 周。
如果你在计算中添加一天,你就会得到你想要的
Names Default To Here( 1 );
Week Of Year( Today() + In Days( 1 ) );
除了“一周的第一天”的不同日期外,一年中的一周的一般计算方式也有点令人惊讶。
特别是在比较“一年中的一周”和“一年中的一周”(来自新公式上下文菜单)时。
2023 年,规则 #3 比规则 #1 延迟了 1 周以上:


New Table( "Week",
Add Rows( 30 ),
New Column( "date",
Format( "m/d/y", 12 ),
Formula( Date MDY( 1, 1, 2023 ) + (Row() - 11) * (24 * 3600) )
),
New Column( "\!"Year Week\!"",
Character,
"Nominal",
Formula(
Local(
{w = Week Of Year( :date, 3 ), y = Year( :date ), m = Month( :date )
},
If( Is Missing( :date ),
"",
Char( If( m / w >= 12, y + 1, w / m >= 52, y - 1, y ) ) ||
If( w >= 10, "W", "W0" ) || Char( w )
)
)
)
),
New Column( "Week of Year, rule1",
Formula( Week Of Year( :date ) )
),
New Column( "Week of Year, rule3",
Format( "Best", 12 ),
Formula( Week Of Year( :date, 3 ) ),
Color Cells( {32, {19, 20, 21, 22, 23, 24, 25}} )
),
New Column( "day",
Formula( Day Of Week( :date ) ),
Value Labels( {1 = "Sun", 2 = "Mon"} ),
Use Value Labels( 1 )
)
)