Python 计算两个日期之间的周时数对
以Python 计算两个日期之间的周时数对,python,datetime,python-3.x,timedelta,Python,Datetime,Python 3.x,Timedelta,以24H格式考虑以下工作日小时对列表: { 'Mon': [9,23], 'Thu': [12, 13, 14], 'Tue': [11, 12, 14], 'Wed': [11, 12, 13, 14] 'Fri': [13], 'Sat': [], 'Sun': [], } 和两个时间点,例如: 开始: datetime.datetime(2015, 7, 22, 17, 58, 54, 746784) 结束: datetime.datetime(2015, 8, 30
24H
格式考虑以下工作日小时对列表:
{
'Mon': [9,23],
'Thu': [12, 13, 14],
'Tue': [11, 12, 14],
'Wed': [11, 12, 13, 14]
'Fri': [13],
'Sat': [],
'Sun': [],
}
和两个时间点,例如:
- 开始:
datetime.datetime(2015, 7, 22, 17, 58, 54, 746784)
- 结束:
datetime.datetime(2015, 8, 30, 10, 22, 36, 363912)
timedelta
和relativedelta
进行了全面的详细研究,但没有找到与此类似的东西
为了简单起见,我们可以假设所有东西都指向同一时区
也许一个更简单的问题是关注一个单日-小时对,例如,在两个任意日期时间之间有多少个
周三:14个?因此,如果我正确理解了你的问题,我会从查找时间范围内“小时”的第一次出现开始,然后每周查找下一次出现的时间。像这样:
#!/usr/bin/python
from __future__ import print_function
import datetime
import dateutil.relativedelta
def hours_between(start, end, weekday, hour):
first = start + dateutil.relativedelta.relativedelta(
weekday=weekday, hour=hour,
minute=0, second=0, microsecond=0)
week = dateutil.relativedelta.relativedelta(weeks=1)
all_dates = []
d = first
while d < end:
all_dates.append(d)
d += week
return all_dates
def main():
start = datetime.datetime(2015, 7, 22, 17, 58, 54, 746784)
end = datetime.datetime(2015, 8, 30, 10, 22, 36, 363912)
all_dates = hours_between(start, end, dateutil.relativedelta.WE, 14)
print(all_dates)
print(len(all_dates))
main()
#/usr/bin/python
来自未来导入打印功能
导入日期时间
导入dateutil.relativedelta
定义时间间隔(开始、结束、工作日、小时):
first=start+dateutil.relativedelta.relativedelta(
工作日=工作日,小时=小时,
分钟=0,秒=0,微秒=0)
week=dateutil.relativedelta.relativedelta(week=1)
所有日期=[]
d=第一
当d
也许我没有完全理解您的问题,但您可以得到两个日期之间的所有小时数,并计算两个日期之间每小时和每天出现的次数:
from datetime import datetime
from dateutil import rrule,parser
d={
'Mon': [9, 23],
'Thu': [12, 13, 14],
'Tue': [11, 12, 14],
'Wed': [11, 12, 13, 14],
'Fri': [13],
'Sat': [],
'Sun': [],
}
st = datetime(2015, 7, 22, 17, 58, 54, 746784)
ed = datetime(2015, 8, 30, 10, 22, 36, 363912)
dates = list(rrule.rrule(rrule.HOURLY,
dtstart=parser.parse(st.strftime("%Y-%m-%d %H:%M:%S")),
until=parser.parse(ed.strftime("%Y-%m-%d %H:%M:%S"))))
days = {"Mon":0,"Tue": 1,"Wed":2,"Thu": 3,"Fri":4,"Sat":5,"Sun":6}
for k, val in d.items():
for v in val:
print("day: {} hour: {}".format(k,v))
day = days[k]
print(sum((v == dt.hour and dt.weekday() == day) for dt in dates))
输出:
day: Wed hour: 11
5
day: Wed hour: 12
5
day: Wed hour: 13
5
day: Wed hour: 14
5
day: Fri hour: 13
6
day: Tue hour: 11
5
day: Tue hour: 12
5
day: Tue hour: 14
5
day: Mon hour: 9
6
day: Mon hour: 23
5
day: Thu hour: 12
5
day: Thu hour: 13
5
day: Thu hour: 14
5
{'Fri': {13: 6},
'Mon': {9: 5, 23: 5},
'Sat': {},
'Sun': {},
'Thu': {12: 6, 13: 6, 14: 6},
'Tue': {11: 5, 12: 5, 14: 5},
'Wed': {11: 5, 12: 5, 13: 5, 14: 5}}
不确定您想要的是每个列表中所有小时的总和还是每个小时的总和,但无论哪种方式,您都可以将输出存储在dict中
counts = {'Thu':{}, 'Sun':{}, 'Fri':{}, 'Mon':{}, 'Tue':{}, 'Sat':{}, 'Wed':{}}
for k, val in d.items():
for v in val:
day = days[k]
sm = sum((v == dt.hour and dt.weekday() == day) for dt in dates)
counts[k][v] = sm
from pprint import pprint as pp
pp(counts)
输出:
day: Wed hour: 11
5
day: Wed hour: 12
5
day: Wed hour: 13
5
day: Wed hour: 14
5
day: Fri hour: 13
6
day: Tue hour: 11
5
day: Tue hour: 12
5
day: Tue hour: 14
5
day: Mon hour: 9
6
day: Mon hour: 23
5
day: Thu hour: 12
5
day: Thu hour: 13
5
day: Thu hour: 14
5
{'Fri': {13: 6},
'Mon': {9: 5, 23: 5},
'Sat': {},
'Sun': {},
'Thu': {12: 6, 13: 6, 14: 6},
'Tue': {11: 5, 12: 5, 14: 5},
'Wed': {11: 5, 12: 5, 13: 5, 14: 5}}
也许是这样的:
from calendar import day_abbr
from datetime import datetime, timedelta
def solve(start, end, data):
days = list(day_abbr)
output = dict.fromkeys(days, 0)
while start <= end:
day = days[start.weekday()]
if start.hour in data[day]:
output[day] += 1
start = start + timedelta(minutes=60)
return output
data = {
'Mon': [9, 23],
'Thu': [12, 13, 14],
'Tue': [11, 12, 14],
'Wed': [11, 12, 13, 14],
'Fri': [13],
'Sat': [],
'Sun': [],
}
start = datetime(2015, 7, 22, 17, 58, 54, 746784)
end = datetime(2015, 8, 30, 10, 22, 36, 363912)
print solve(start, end, data)
# {'Wed': 20, 'Sun': 0, 'Fri': 6, 'Tue': 15, 'Mon': 10, 'Thu': 18, 'Sat': 0}
来自日历导入日\u缩写
从datetime导入datetime,timedelta
def解算(开始、结束、数据):
天数=列表(日期缩写)
输出=dict.fromkeys(天,0)
开始时,这里有一个带有循环和日期时间的解决方案:
import datetime
pairs = {1: [9,23],
2: [11, 12, 14],
3: [11, 12, 13, 14],
4: [12, 13, 14],
5: [13],
6: [],
7: []
}
start = datetime.datetime(2015, 7, 22, 17, 58, 54, 746784)
end = datetime.datetime(2015, 8, 30, 10, 22, 36, 363912)
result={}
for d,hl in pairs.items():
for h in hl:
result[(d,h)] = 0
for diff in range((end-start).days*24):
comp = start + datetime.timedelta(hours=diff)
if comp.isoweekday() == d and comp.hour == h:
result[(d,h)] += 1
我还将尝试使用timestamp()
和%
的解决方案这里是另一个使用算术的解决方案:
import datetime
pairs = {1: [9,23],
2: [11, 12, 14],
3: [11, 12, 13, 14],
4: [12, 13, 14],
5: [13],
6: [],
7: []
}
start = datetime.datetime(2015, 7, 22, 17, 58, 54, 746784)
end = datetime.datetime(2015, 8, 30, 10, 22, 36, 363912)
result={}
weeks = (end-start).days//7
for d,hl in pairs.items():
for h in hl:
initial = weeks
if d > start.isoweekday() or (
d == start.isoweekday() and h >= start.hour):
initial += 1
result[(d,h)] = initial
时区在这里重要吗?谢谢@SimeonVisser,我们可以假设所有东西都指向同一时区。我将在OP中澄清。因此,基本上,在2015-07-22 17:58:54和2015-08-30 10:22:36之间有多少个星期三下午2点?@TigerhawkT3正确。我相信你应该从计算两个时间点之间的周数开始。看,谢谢有什么理由相信其中一种解决方案比另一种更有效?(例如,通过数十万对循环示例)@AmelioVazquez-Reina-我不确定;我没有测试它。我只是怀疑一点算术运算会比在每一个可能的小时里循环更快。如果您想尝试其中一些解决方案并让我们知道您的结果,我很有兴趣看到它们。为了澄清,我没有测试每个算法的相对性能。@AmelioVazquez Reina-我只是对其进行了重构,删除了许多不必要的内容。现在应该更清晰更快了。
>>> for k in sorted(result):
... print(k, result[k])
...
(1, 9) 5
(1, 23) 5
(2, 11) 5
(2, 12) 5
(2, 14) 5
(3, 11) 5
(3, 12) 5
(3, 13) 5
(3, 14) 5
(4, 12) 6
(4, 13) 6
(4, 14) 6
(5, 13) 6