使用 python 获取两个日期之间的周数
Get the week numbers between two dates with python
我想找到最 pythonic 的方法来输出两个日期之间的周数列表。
例如:
输入
start = datetime.date(2011, 12, 25)
end = datetime.date(2012, 1, 21)
输出
find_weeks(start, end)
>> [201152, 201201, 201202, 201203]
我一直在努力使用日期时间库,但收效甚微
(更新: 删除了 less-readable 选项)
import datetime
def find_weeks(start,end):
l = []
for i in range((end-start).days + 1):
d = (start+datetime.timedelta(days=i)).isocalendar()[:2] # e.g. (2011, 52)
yearweek = '{}{:02}'.format(*d) # e.g. "201152"
l.append(yearweek)
return sorted(set(l))
start = datetime.date(2011, 12, 25)
end = datetime.date(2012, 1, 21)
print(find_weeks(start,end)[1:]) # [1:] to exclude first week.
Returns
['201152', '201201', '201202', '201203']
要包含第一周 (201151),只需在函数调用后删除 [1:]
.isocalendar()
是你的朋友 - 它 returns (year, week of year, day of week)
的一个元组。我们用它来将开始日期重置为一周的开始,然后每次都增加一周,直到我们通过结束日期:
import datetime
def find_weeks(start_date, end_date):
subtract_days = start_date.isocalendar()[2] - 1
current_date = start_date + datetime.timedelta(days=7-subtract_days)
weeks_between = []
while current_date <= end_date:
weeks_between.append(
'{}{:02d}'.format(*current_date.isocalendar()[:2])
)
current_date += datetime.timedelta(days=7)
return weeks_between
start = datetime.date(2011, 12, 25)
end = datetime.date(2012, 1, 21)
print(find_weeks(start, end))
这会打印
['201152', '201201', '201202', '201203']
使用Pandas
import pandas as pd
dates=pd.date_range(start=start,end=end,freq='W')
date_index=dates.year.astype(str)+dates.weekofyear.astype(str).str.zfill(2)
date_index.tolist()
我建议您采用以下 easy-to-read 解决方案:
import datetime
start = datetime.date(2011, 12, 25)
end = datetime.date(2012, 1, 21)
def find_weeks(start, end):
l = []
while (start.isocalendar()[1] != end.isocalendar()[1]) or (start.year != end.year):
l.append(start.isocalendar()[1] + 100*start.year)
start += datetime.timedelta(7)
l.append(start.isocalendar()[1] + 100*start.year)
return (l[1:])
print(find_weeks(start, end))
>> [201252, 201201, 201202, 201203]
我想找到最 pythonic 的方法来输出两个日期之间的周数列表。
例如:
输入
start = datetime.date(2011, 12, 25)
end = datetime.date(2012, 1, 21)
输出
find_weeks(start, end)
>> [201152, 201201, 201202, 201203]
我一直在努力使用日期时间库,但收效甚微
(更新: 删除了 less-readable 选项)
import datetime
def find_weeks(start,end):
l = []
for i in range((end-start).days + 1):
d = (start+datetime.timedelta(days=i)).isocalendar()[:2] # e.g. (2011, 52)
yearweek = '{}{:02}'.format(*d) # e.g. "201152"
l.append(yearweek)
return sorted(set(l))
start = datetime.date(2011, 12, 25)
end = datetime.date(2012, 1, 21)
print(find_weeks(start,end)[1:]) # [1:] to exclude first week.
Returns
['201152', '201201', '201202', '201203']
要包含第一周 (201151),只需在函数调用后删除 [1:]
.isocalendar()
是你的朋友 - 它 returns (year, week of year, day of week)
的一个元组。我们用它来将开始日期重置为一周的开始,然后每次都增加一周,直到我们通过结束日期:
import datetime
def find_weeks(start_date, end_date):
subtract_days = start_date.isocalendar()[2] - 1
current_date = start_date + datetime.timedelta(days=7-subtract_days)
weeks_between = []
while current_date <= end_date:
weeks_between.append(
'{}{:02d}'.format(*current_date.isocalendar()[:2])
)
current_date += datetime.timedelta(days=7)
return weeks_between
start = datetime.date(2011, 12, 25)
end = datetime.date(2012, 1, 21)
print(find_weeks(start, end))
这会打印
['201152', '201201', '201202', '201203']
使用Pandas
import pandas as pd
dates=pd.date_range(start=start,end=end,freq='W')
date_index=dates.year.astype(str)+dates.weekofyear.astype(str).str.zfill(2)
date_index.tolist()
我建议您采用以下 easy-to-read 解决方案:
import datetime
start = datetime.date(2011, 12, 25)
end = datetime.date(2012, 1, 21)
def find_weeks(start, end):
l = []
while (start.isocalendar()[1] != end.isocalendar()[1]) or (start.year != end.year):
l.append(start.isocalendar()[1] + 100*start.year)
start += datetime.timedelta(7)
l.append(start.isocalendar()[1] + 100*start.year)
return (l[1:])
print(find_weeks(start, end))
>> [201252, 201201, 201202, 201203]