从日期时间等历获取冲突的信息



我有一个列表,它给了我工作日(1-7,好像星期一到星期日(和给定年份的周数。我需要将该信息转换为给定日期。

因此,我编写了一个简单的脚本,其中包含三个参数: 1. 年份 2. 平日 3. 周数

然后找出日期。

我的脚本基本上迭代给定年份的所有日子,并创建一个日期时间对象,然后我提取 isocalendar(([1] 以将其与周数进行比较。

我发现如果我给输入 2017 7 52,我会得到两个输出!

最基本的本质是这样的:

#!/Library/Frameworks/Python.framework/Versions/3.7/bin/python3
import datetime
def print_dt(year, month, day):
dt = datetime.date(year, month, day)
print("%d-%d-%d (%d) -> week# %d" % (year, month, day, dt.weekday(), dt.isocalendar()[1]))
print_dt(2017, 1, 1)
print_dt(2017, 12, 31)

输出是相同的:

Anibals-iMac:RPEG anibal$ ./findDate-fixed-date.py
2017-1-1 (6) -> week# 52
2017-12-31 (6) -> week# 52

这怎么可能?这意味着2017年的第52周有两个#6,即两个不同的星期日。这种情况给我的脚本带来了问题。

关于如何解决这个问题的任何想法?

我最初的问题是我在 YYYYMMDD 中给出了事件,我需要按周#按年对它们进行分组。所以,我可以说X数量的事件发生在2017年的第#4周。在上述情况下,当它归结为第 52 周时不起作用,因为 YYYYMMDD 有多种解决方案。

您混淆了 ISO 日历年和公历年。

2017-1-1日期是 ISO 日历中 2016 年第 52 周的第 7 天。

ISO 日历将 ISO 日历年的第一周定义为包含相应公历年的第一个星期四的一周。 这可能是 1 月 1 日至 7 日的任何地方。 由于 ISO 数字天数与星期一 = 1 到星期日 = 7,这意味着在每个新年前后最多三天,公历年和日期的 ISO 日历年不一致。

2015 年 1 月 1 日是星期四,因此尽管是在 2014 年 12 月,但它有 ISO 日历年 2015 之前的星期一、星期二和星期三。 同样,2016年1月7日是星期四,2016年1月1日星期五至1月3日星期日,尽管是在2016年,但还是有ISO日历年2015年。

您的脚本似乎在公历中占用了一年,遍历此公历年的所有日子,并查找具有匹配的星期几和 ISO 周数的日期。 您发现这三个值(公历年、ISO 周号 ISO 星期几(不能唯一标识日期。 您的脚本需要考虑这样一个事实,即 ISO 日历年和公历年并不总是在 ISO 日历年而不是公历年上一致和匹配。 一种方法是:

  • 在您搜索的日期范围内包括上一个公历年的最后三天和下一个公历年的前三天,以及
  • 以及 ISO 周数和 ISO 星期几的匹配,请确保 ISO 年份也匹配。 ISO 年是dt.isocalendar()[0].

或者,作为替代方案,您可以完全避免使用 ISO 日历系统,而是考虑如下内容:

def get_week_and_day(year, month, day):
wday_of_jan_1 = datetime.date(year, 1, 1).timetuple().tm_wday
daytuple = datetime.date(year, month, day).timetuple()
wday = daytuple.tm_wday
week = (daytuple.tm_yday - 1 + wday_of_jan_1) // 7 + 1
return (week, wday)

给定一年、一个月和一天,这将返回一年中的一周和星期几,周从星期一开始(根据time.struct_time(,第 1 周是 1 月 1 日所在的一周。 周数通常上升到 53,但如果闰年的 12 月 31 日是星期一(如 2012 年(,这一天将有第 54 周。

这是通过使用date.timetuple()方法获取日期的工作日和一年中的某天,以及该年 1 月 1 日的星期几来工作的。 在计算week时,我们:

  • 从给定日期的日期(daytuple.tm_yday(中减去1,这样1月1日0,1月2日1,依此类推。
  • 再加上 1 月 1 日的星期几。 我们这样做是因为 1 月 1 日的星期几也是一年中第一周"丢失"到上一年的天数。 例如,如果 1 月 1 日是星期三,则wday_of_jan_1将是 2,则第 1 周将缺少之前的星期一和星期二,因此第一周将只有 5 天。
  • 到目前为止的计算给出了给定日期和 1 月 1 日或之前的第一个星期一之间的天数。 然后我们可以将其除以 7 以获得自本周一以来的整周数,最后加上 1,以便 1 月 1 日是第 1 周而不是第 0 周。

这种方法还避免了循环访问一整年的日期并对其执行计算。

最新更新