是否可以获取所有星期一和星期日并将其存储在嵌套列表/元组中。
Sample data:
dates = [2010-01-01, 2010-01-04, 2010-01-05, 2010-01-06, 2010-01-08, 2010-01-10, 2010-01-11, 2010-01-15, 2010-01-17]
Expected result:
result = ([2010-01-04, 2010-01-10], [2010-01-11, 2010-01-17])
为阐明预期结果,我想将result
与([Monday, Sunday], [Monday, Sunday])
分组。
答案 0 :(得分:4)
from datetime import datetime
dates = ['2010-01-01', '2010-01-04', '2010-01-05', '2010-01-06',
'2010-01-08', '2010-01-10', '2010-01-11', '2010-01-15',
'2010-01-17']
def weekday(date_str):
return datetime.strptime(date_str, '%Y-%m-%d').weekday()
result = [[date for date in dates if weekday(date) == n] for n in {6, 0}]
print(result)
>>> [['2010-01-04', '2010-01-11'], ['2010-01-10', '2010-01-17']]
答案 1 :(得分:3)
IIUC,使用itertools.groupby
和datetime.strftime
:
from itertools import groupby
from datetime import datetime
dates = [datetime.strptime(x, '%Y-%m-%d') for x in dates]
res = []
for k, g in groupby(dates, key=lambda x: x.strftime('%W')):
l = [i for i in g if i.weekday() in {0, 6}]
if l:
res.append([i.strftime('%Y-%m-%d') for i in l])
res
输出:
[['2010-01-04', '2010-01-10'],
['2010-01-11', '2010-01-17']]
答案 2 :(得分:2)
您可以使用calendar
模块:
import calendar, datetime
def get_day(d):
_d = datetime.date(*map(int, d.split('-')))
c = calendar.Calendar().monthdatescalendar(_d.year, _d.month)
return [i for k in c for i, a in enumerate(k) if a == _d][0]
dates = ['2010-01-01', '2010-01-04', '2010-01-05', '2010-01-06', '2010-01-08', '2010-01-10', '2010-01-11', '2010-01-15', '2010-01-17']
t = [(i, get_day(i)) for i in dates]
sun, mon = [a for a, b in t if b == 6], [a for a, b in t if not b]
输出:
#sun:
['2010-01-10', '2010-01-17']
#mon:
['2010-01-04', '2010-01-11']
编辑:如果要查找输入列表中存在的周一至周日范围:
import calendar, datetime
dates = ['2010-01-01', '2010-01-04', '2010-01-05', '2010-01-06', '2010-01-08', '2010-01-10', '2010-01-11', '2010-01-15', '2010-01-17']
d = [datetime.date(*map(int, i.split('-'))) for i in dates]
new_d = [[str(i[0]), str(i[-1])] for j, k in set(map(lambda x:(x.year, x.month), d)) for i in calendar.Calendar().monthdatescalendar(j, k) if i[0] in d and i[-1] in d]
输出:
[['2010-01-04', '2010-01-10'], ['2010-01-11', '2010-01-17']]
答案 3 :(得分:2)
您可以尝试以下方法:
dates = ['2010-01-01', '2010-01-04', '2010-01-05', '2010-01-06', '2010-01-08', '2010-01-10', '2010-01-11', '2010-01-15', '2010-01-17']
MS=[[], []]
for date in dates:
dayofweek = datetime.datetime.strptime(date, '%Y-%m-%d').strftime('%A')
if dayofweek == 'Sunday':
MS[0].append(date)
elif dayofweek == 'Monday':
MS[1].append(date)
MS
# [['2010-01-10', '2010-01-17'], ['2010-01-04', '2010-01-11']]
答案 4 :(得分:1)
您还可以使用默认列表将日期分组,然后仅输出星期一和星期日的工作日数字0-6,在这种情况下为0和6。
from datetime import datetime
from collections import defaultdict
dates = [
"2010-01-01",
"2010-01-04",
"2010-01-05",
"2010-01-06",
"2010-01-08",
"2010-01-10",
"2010-01-11",
"2010-01-15",
"2010-01-17",
]
d = defaultdict(list)
for date in dates:
dt = datetime.strptime(date, "%Y-%m-%d")
d[dt.weekday()].append(date)
result = (d[0], d[6])
print(result)
输出:
(['2010-01-04', '2010-01-11'], ['2010-01-10', '2010-01-17'])