如何在Alteryx或Python中计算日期是当年对应星期几的第几次出现
实现方案
方案1:Alteryx原生无代码实现
操作步骤:
- 先使用
DateTime工具将输入的Date字段转换为Alteryx标准日期格式,避免文本格式导致计算错误 - 新增
Formula工具,依次计算如下临时字段:FirstDayOfYear:当年第一天,公式为DateTimeFirstOfYear([Date])CurWeekDay:当前日期的星期编号(周日为0,周一为1,依次类推),公式为DateTimeDayOfWeek([Date], 0)FirstDayWeek:当年第一天的星期编号,公式为DateTimeDayOfWeek([FirstDayOfYear], 0)FirstTargetWeekDay:当年第一个和当前日期同星期的日期,公式为:
IIF([CurWeekDay] >= [FirstDayWeek], DateTimeAdd([FirstDayOfYear], [CurWeekDay]-[FirstDayWeek], "days"), DateTimeAdd([FirstDayOfYear], 7 - [FirstDayWeek] + [CurWeekDay], "days") ) - 新增最终结果字段
Number Of WeekDay in Year,公式为:DateTimeDiff([Date], [FirstTargetWeekDay], "days")/7 + 1 - 最后用
Select工具删除所有临时字段,输出结果即可。
如果你的计数规则是周一为一周第一天,只需要把DateTimeDayOfWeek的第二个参数从0改成1即可。
方案2:Alteryx内置Python工具实现
将以下代码复制到Python工具的编辑区,输入端口连接你的日期数据源即可直接运行:
import pandas as pd from alteryx import Alteryx # 读取Alteryx输入流数据 df = Alteryx.read("#1") # 转换为标准日期格式 df["Date"] = pd.to_datetime(df["Date"]) # 计算当年第一天 df["first_day_of_year"] = df["Date"].dt.to_period("Y").dt.to_timestamp() # 计算星期编号,周日为0,和原生工具逻辑对齐 df["cur_weekday"] = (df["Date"].dt.weekday + 1) % 7 df["first_weekday"] = (df["first_day_of_year"].dt.weekday + 1) % 7 # 计算当年第一个同星期的日期 def get_first_target_day(row): if row["cur_weekday"] >= row["first_weekday"]: offset = row["cur_weekday"] - row["first_weekday"] else: offset = 7 - row["first_weekday"] + row["cur_weekday"] return row["first_day_of_year"] + pd.Timedelta(days=offset) df["first_target_day"] = df.apply(get_first_target_day, axis=1) # 计算最终结果 df["Number Of WeekDay in Year"] = (df["Date"] - df["first_target_day"]).dt.days //7 + 1 # 清理临时字段后输出到Alteryx df = df.drop(columns=["first_day_of_year", "cur_weekday", "first_weekday", "first_target_day"]) Alteryx.write(df, 1)
内容的提问来源于stack exchange,提问作者craig3656
相关产品推荐
相关产品推荐

