【问题标题】:How to calculate week number in hive or python? The week should run from Saturday to Friday如何计算 hive 或 python 中的周数?一周应该从周六到周五
【发布时间】:2020-03-30 06:52:17
【问题描述】:

我尝试了以下方法: 选择weekofyear(current_timestamp) 但这会计算从星期一到星期日的一周。我想要从周六到周五的一周,基于它应该填充周数。 在 hive 中如果我们做不到,那么在 python 中呢?

在python中我试过了:

A = datetime.date(2020, 3, 29).isocalendar()[1]

但这又是计算从星期一到星期六的一周

【问题讨论】:

  • 为什么不加一个偏移量?
  • 新蜜蜂到python..如何应用偏移量?
  • 如果当天是周六或周日,结果加1?
  • 您需要定义如何计算一年中第一天的周数。来自 Python 手册,关于公历的工作原理:“ISO 年由 52 或 53 个整周组成,一周从星期一开始,到星期日结束。ISO 年的第一周是第一周(公历)一年中包含星期四的日历周。这称为第 1 周,该星期四的 ISO 年与其公历年相同。"

标签: python hive hiveql


【解决方案1】:

再试一次,假设 1 月 1 日总是在第 1 周。

from datetime import date
from calendar


def week_number(ndate, week_start=calendar.MONDAY):
    new_years_day = ndate.replace(month=1, day=1)
    offset = (new_years_day.weekday() - week_start) % 7  # Count back to start of week. Modulo for positive value.
    all_days = (ndate - new_years_day).days + offset  # Days ago week 1 started.

    return (all_days // 7) + 1  # Integer division means we don't have to floor() it. Add 1 for human readable numbers.


print(week_number(date(2020, 1, 1)))  # 1, always
print(week_number(date(2020, 3, 29)))  # 13
print(week_number(date(2020, 3, 29), calendar.SATURDAY))  # 14
print(week_number(date(2020, 3, 27), calendar.SATURDAY))  # 13

【讨论】:

  • 我认为你应该加1,而不是减1,对吧?此外,如果以某种方式抵消,您没有考虑到年初实际上可能成为上一年的最后一周。
  • 实际上,提前一周开始意味着您的周数可能会减少。但是,是的,前一年的 week num 可能是一个问题。例如,get_week_number(date(2016,1,1)) 将返回 53。不同的周数系统处理它的方式不同,因此我认为它需要比我们这里更清晰的定义。
  • 没有像我想的那样工作。这很有趣,需要相当多的思考。最重要的是,您需要非常清楚地定义如何确定一年中的第一天是哪一周。我想我找到了 3 种不同的方法。
【解决方案2】:
import datetime

def week_number(ndate):
    odate = datetime.datetime(ndate.year, 1, 1) 
    spec = odate.weekday()
    alldays =    (ndate - odate).days + spec - 4

    mod = alldays % 7
    days = (alldays - mod) / 7

    if (mod > 0):
        days = days + 1

    return (int)days

print(week_number(datetime.datetime.today()))

【讨论】:

  • 如果你使用% 7,请务必了解 sn-p 应该如何计算 1 到 51 之间的周数
  • 不,它不起作用。它给出了日期 01/01/2020 的第 4 周
  • 我使用受此答案启发的代码更新了我的答案,而不是我之前失败的尝试。对那个很满意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多