Python:从给定日期开始和结束一周的数据


77
day = "13/Oct/2013"
print("Parsing :",day)
day, mon, yr= day.split("/")
sday = yr+" "+day+" "+mon
myday = time.strptime(sday, '%Y %d %b')
Sstart = yr+" "+time.strftime("%U",myday )+" 0"
Send = yr+" "+time.strftime("%U",myday )+" 6"
startweek = time.strptime(Sstart, '%Y %U %w')
endweek = time.strptime(Send, '%Y %U %w')
print("Start of week:",time.strftime("%a, %d %b %Y",startweek))
print("End of week:",time.strftime("%a, %d %b %Y",endweek))
print("Data entered:",time.strftime("%a, %d %b %Y",myday))

out:
Parsing : 13/Oct/2013
Start of week: Sun, 13 Oct 2013
End of week: Sat, 19 Oct 2013
Sun, 13 Oct 2013

在过去的两天里学习过python,并且想知道是否有更清洁的方法来执行此方法。此方法看起来很丑,而且必须为每个日期创建一个新的时间变量似乎很愚蠢,并且应该通过一个简单的电话就可以将给定的日期偏移到一周的开始和结束,但是我一直无法在互联网上找到任何看起来可行的文件或文档。


1
这不是编程评论,但我从未见过有人写过类似“ 13 / Oct / 2013”​​的日期。您确定这就是解析输入的方式吗?
Brionius

@Brionius我不知道OP的来源,但是在我的国家,这种格式很普遍(甚至可能是最常见的)。
Hyperboreus 2013年

3
呵呵-真有趣。我从未见过基于斜杠的日期符号中的非数字段。
Brionius

Answers:


179

使用datetime模块。

这将产生一周的开始和结束(从星期一到星期日):

from datetime import datetime, timedelta

day = '12/Oct/2013'
dt = datetime.strptime(day, '%d/%b/%Y')
start = dt - timedelta(days=dt.weekday())
end = start + timedelta(days=6)
print(start)
print(end)

编辑:

print(start.strftime('%d/%b/%Y'))
print(end.strftime('%d/%b/%Y'))

2
是开始和结束日期时间对象,或者是字符串。我需要将输出格式设置为像我最初提出的问题那样,我尝试使用,datetime.strftime(“%a,%d%b%Y”,end),但是它说end是一个字符串,而不是datetime对象。
shadowtdt09 2013年

1
感谢您的帮助,这是最后一个问题,是否可以将一周的开始时间更改为星期日而不是星期一?
shadowtdt09 2013年

17
只需将工作日移动一天即可。这样的事情start = dt - timedelta(days = (dt.weekday() + 1) % 7)应该起作用。
Hyperboreus

如果一天中还有时间部分,加减法又如何工作?像day = '12/10/2013 13:43:43'什么?
Vineet Menon 2014年

1
@SaravananNandhan确保您要从日期时间导入日期时间,而不仅仅是日期时间。所以from datetime import datetime,不是import datetime
吉瓦尔

30

如果要保留标准时间格式并参考当天,请稍作更改:

from datetime import datetime, timedelta

today = datetime.now().date()
start = today - timedelta(days=today.weekday())
end = start + timedelta(days=6)
print("Today: " + str(today))
print("Start: " + str(start))
print("End: " + str(end))

19

使用摆锤模块:

today = pendulum.now()
start = today.start_of('week')
end = today.end_of('week')

这正是我所需要的
Raveen Beemsingh

1
...这正是您所需要的,只要您的周开始和周日晚上结束即可。钟摆显然无法将一周的结束时间设置为星期六的23:59:59。
亚伦·德·布鲁因

4
我今天发现了摆。根据其文档,真正的#ISO8601周从星期一开始,到星期日结束。如果无法更改,那将是一种耻辱。经过一番搜索,我发现了这个。因此,如果添加pendulum.week_starts_at(pendulum.SUNDAY)pendulum.week_ends_at(pendulum.SATURDAY),则应该能够使用start_of()end_of()方法获得正确的日期。我不确定这是否可行,但似乎可以在我的测试中使用。
k427h1c

1

您还可以使用Arrow

import arrow
now = arrow.now()
start_of_week = now.floor('week')
end_of_week = new.ceil('week')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.