- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 shift
这是一个日期时间间隔(一对 datetime
s)。我的周有一个带标签的分区(每周都是一样的:分成几个部分,每个部分都有一个标签)。我要分手shift
根据一周的分区划分为标记的部分(即划分为几个子区间)。
例子。 假设 shift
是区间 2019-10-21 18:30
- 2019-10-22 08:00
,一周的分区如下: 周一到周五 07:00 - 19:00 有标签A
, 本周剩余时间有标签 B
.
在这种情况下shift
的 split 应该是以下带标签的子区间列表:
2019-10-21 18:30
- 2019-10-21 19:00
带标签A
, 2019-10-21 19:00
- 2019-10-22 07:00
带标签B
, 和 2019-10-22 07:00
- 2019-10-22 08:00
带标签A
. datetime
间隔(对)和一周的标记分区(如何最好地表示这一点?)
datetime
的列表间隔(对)。
shift
可以在一周内开始并在另一周结束(例如周日晚上到周一早上);每个星期都有相同的标记分区。
最佳答案
这是一种获得所需间隔的方法:
from collections import namedtuple
from datetime import datetime, timedelta
import itertools as it
# Built-in as `it.pairwise` in Python 3.10+
def pairwise(iterable):
it = iter(iterable)
a = next(it, None)
for b in it:
yield (a, b)
a = b
def beginning_of_week(d: datetime) -> datetime:
''' Returns the datetime object for the beginning of the week the provided day is in. '''
return (d - timedelta(days=d.weekday())).replace(hour=0, minute=0, second=0, microsecond=0)
Partition = namedtuple('Partition', ('start', 'stop', 'label')) # output format
def _partition_shift_within_week(start: int, stop: int, partitions):
''' Splits the shift (defined by `start` and `stop`) into partitions within one week. '''
# Get partitions as ranges of absolute offsets from the beginning of the week in seconds
labels = (x for _, x in partitions)
absolute_offsets = it.accumulate(int(x.total_seconds()) for x, _ in partitions)
ranges = [range(x, y) for x, y in pairwise((0, *absolute_offsets))]
first_part_idx = [start in x for x in ranges].index(True)
last_part_idx = [stop in x for x in ranges].index(True)
for r, label in zip((ranges[i] for i in range(first_part_idx, last_part_idx + 1)), labels):
yield Partition(
timedelta(seconds=max(r.start, start)), # start of subinterval
timedelta(seconds=min(r.stop, stop)), # end of the subinterval
label
)
def _partition_shift_unjoined(shift, partitions):
''' Partitions a shift across weeks with partitions unjoined at the week edges. '''
start_monday = beginning_of_week(shift[0])
stop_monday = beginning_of_week(shift[1])
seconds_offsets = (
int((shift[0] - start_monday).total_seconds()),
*[604800] * ((stop_monday - start_monday).days // 7),
int((shift[1] - stop_monday).total_seconds()),
)
for x, y in pairwise(seconds_offsets):
num_weeks, x = divmod(x, 604800)
for part in _partition_shift_within_week(x, y - (y == 604800), partitions):
weeks_offset = timedelta(weeks=num_weeks)
yield Partition(
start_monday + weeks_offset + part.start,
start_monday + weeks_offset + part.stop,
part.label
)
def partition_shift(shift, partitions):
''' Partitions a shift across weeks. '''
results = []
for part in _partition_shift_unjoined(shift, partitions):
if len(results) and results[-1].label == part.label:
results[-1] = Partition(results[-1].start, part.stop, part.label)
else:
results.append(part)
return results
用法示例:
shift = (datetime(2019, 10, 21, 18, 30), datetime(2019, 10, 22, 8, 0))
# Partitions are stored as successive offsets from the beginning of the week
partitions = (
(timedelta(hours=7), 'B'), # Monday morning (midnight to 07:00)
(timedelta(hours=12), 'A'),
(timedelta(hours=12), 'B'), # Monday night & Tuesday morning (til 07:00)
(timedelta(hours=12), 'A'),
(timedelta(hours=12), 'B'), # Tuesday night & Wednesday morning (til 07:00)
(timedelta(hours=12), 'A'),
(timedelta(hours=12), 'B'), # Wednesday night & Thursday morning (til 07:00)
(timedelta(hours=12), 'A'),
(timedelta(hours=12), 'B'), # Thursday night & Friday morning (til 07:00)
(timedelta(hours=12), 'A'),
(timedelta(hours=53), 'B'), # Friday night & the weekend
)
for start, end, label in partition_shift(shift, partitions):
print(f"'{start}' - '{end}', label: {label}")
输出:
'2019-10-21 18:30:00' - '2019-10-21 19:00:00', label: A
'2019-10-21 19:00:00' - '2019-10-22 07:00:00', label: B
'2019-10-22 07:00:00' - '2019-10-22 08:00:00', label: A
这种方法假设分区是作为从那一周开始的连续偏移量输入的。问题没有指定如何提供分区,所以我选择使用这种格式。这很好,因为它保证它们不会重叠,并且使用时间增量而不是固定到某个特定日期。
partitions
和以前一样,但是一个
shift
从前一周开始,从而证明即使轮类跨越多个星期,这种方法也能奏效。
shift = (datetime(2019, 10, 19, 18, 30), datetime(2019, 10, 22, 8, 0))
for start, end, label in partition_shift(shift, partitions):
print(f"'{start}' - '{end}', label: {label}")
输出:
'2019-10-19 18:30:00' - '2019-10-21 07:00:00', label: B
'2019-10-21 07:00:00' - '2019-10-21 19:00:00', label: A
'2019-10-21 19:00:00' - '2019-10-22 07:00:00', label: B
'2019-10-22 07:00:00' - '2019-10-22 08:00:00', label: A
关于python - 根据一周的标记分区拆分日期时间间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58579016/
moment.js 库很棒,我几乎一直都在使用它,但我最近遇到了一些有趣的事情。我正在尝试按一年中的一周绘制数据,其中一个数据点是 2013 年 12 月 31 日,moment.js 告诉我这是第
有没有办法可以找到给定一年的最后一周的数字。 例如,对于年份 2018 , 2018 的最后一周数是 52。 年份 2015 , 上周数字是 53。 最佳答案 如果您指的是 ISO 周,那么您可以使用
我正在尝试创建一个 if 语句,该语句根据当前日期检查日期,如果日期少于 2 周,则抛出 错误。 我当前的代码 const moment = require('moment') const today
转换 Spark 数据帧 +----+---------+------+ |name|date |amount| +----+---------+------+ |Jhon|4/6/2018
我有这段代码,我想在从日期选择器获取的日期中添加 40 周,并在将 40 周(280 天)添加到从日期选择器获取的日期后获取新日期。 代码: public class MainActivity ext
我的 table 上有一个 timestamp字段,这是一个标准的 RethinkDB 日期字段。 我可以使用此时间戳字段按天/周/月对行进行分组吗?在 group() 文档中找不到任何示例。 最佳答
当用户单击日/周/月按钮时,我需要运行一些 Javascript 代码来重新加载日历。是否有类似 dayButtonClicked() 之类的回调? 发生BUG: 当我第一次加载日历时。最初的 Vie
当我收到年份、周数和星期几时,如何在 C# 中计算日期。例如:年份 = 2011周 = 27天 = 6 结果应该是 2011-7-10 感谢大家。我根据维基百科算法解决了它。 最佳答案 此处没有 C#
如何使用 c#.net 每天、每周和每月发送电子邮件? 我正在考虑创建一个 Windows 服务应用程序,但我不知道该怎么做,也不知道该怎么做。 非常感谢您的想法。 最佳答案 Windows 服务可能
最近我在处理全日历。我想更改周 View 中日期的格式。我发现很多人使用 columnFormat: { month: 'ddd', week: 'ddd d/M', day: 'dddd d/M'
我正在使用一个完整的日历插件来显示各种事件。 我的问题是,当我更改正在查看的月份/周,然后刷新时,我会回到当前的月份/周,而我想留在之前查看的同一个月/周。即如果现在是八月,我回到七月,然后刷新,我希
我有一个按周计算所有工单的查询,但我需要将其转换为动态两行报告,将周开始日期移动到列中? 这就是我试图让它做的事情.. 这是我的查询: SELECT td_type, FROM_DAYS(TO_DAY
我想获取某件事的统计数据。 我正在尝试统计今天、本周、本月的情况。 我的查询: "SELECT COUNT(id) FROM images i WHERE i.user_id = 3 GROUP BY
我正在开发一个有 200.000 个页面的网站。还有一个浏览部分,显示最受欢迎、评价最高等文档。然而,在发布几周后,此部分将变得几乎静态。所以我还想实现一个过滤系统,它将显示今天、本周、本月最受欢迎的
如何从字段日期早于现在 + 2 周的 MySQL 数据库中获取行? 我试过了 WHERE date_ready < DATE_SUB(CURDATE(), INTERVAL 2 WEEK) 但这不是我
我有下表: create table my_table ( SubjectID int, Date Date, Test_Value int ); insert into my_table(Su
好吧,这几天我一直在努力解决这个问题。我是一个 super 初学者,我有一个标签。在该标签中,我显示了日期 1/20/21。我能够做到这一点。然后我有一个按钮。我希望每次单击该按钮都会将日期增加 14
我有一个数据集,其中包含工厂 worker 三年产出的数据。现在我想获得基于日期、周、月的平均输出。问题是日期格式类似于 %d.%m.%Y(日-月-年)。我的问题是如何在保持日期格式不变的同时获得预期
我有这样的东西 DateTime.Now.ToString("dd.MM.yy"); 在我的代码中,我需要添加 1 周,比如 5.4.2012 变成12.4.2012 我试过转成int再累加,但是到3
我已经阅读了几篇关于在 mysql 查询中估计移动平均值的文章,但是我的情况似乎稍微困难一些,因为该表不包含我想要计算平均值的列。我需要计算每组的行数,并显示该组的移动平均值。 表中基本上只有一列相关
我是一名优秀的程序员,十分优秀!