Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中datetime对象的元组_Python_Tuples - Fatal编程技术网

Python中datetime对象的元组

Python中datetime对象的元组,python,tuples,Python,Tuples,我想写一个函数,返回一个元组(start,end),其中start是周一00:00:00:000000,end是周日23:59:59:99999。开始和结束是日期时间对象。没有提供关于日、月或年的其他信息。我试过这个函数 def week_start_end(date): start= date.strptime("00:00:00.000000", "%H:%M:%S.%f") end = date.strptime("23:59:59.999999", "%H:%M:%S.%f") re

我想写一个函数,返回一个元组(start,end),其中start是周一00:00:00:000000,end是周日23:59:59:99999。开始和结束是日期时间对象。没有提供关于日、月或年的其他信息。我试过这个函数

def week_start_end(date):
 start= date.strptime("00:00:00.000000", "%H:%M:%S.%f")
 end = date.strptime("23:59:59.999999", "%H:%M:%S.%f")
return (start,end)

print week_start_end(datetime(2013, 8, 15, 12, 0, 0))
应该返回(datetime(2013,8,11,0,0,0,0),datetime(2013,8,17,23,59,599999))


但是该函数返回带有日期的元组(datetime.datetime(1900,1,1,0,0),datetime.datetime(1900,1,1,23,59,59,9999))

我认为使用datetime.isocalendar是一个很好的解决方案。这为您的示例提供了正确的输出:

import datetime

def iso_year_start(iso_year):
    "The gregorian calendar date of the first day of the given ISO year"
    fourth_jan = datetime.date(iso_year, 1, 4)
    delta = datetime.timedelta(fourth_jan.isoweekday()-1)
    return fourth_jan - delta 

def iso_to_gregorian(iso_year, iso_week, iso_day):
    "Gregorian calendar date for the given ISO year, week and day"
    year_start = iso_year_start(iso_year)
    return year_start + datetime.timedelta(days=iso_day-1, weeks=iso_week-1)


def week_start_end(date):
    year = date.isocalendar()[0]
    week = date.isocalendar()[1]
    d1 = iso_to_gregorian(year, week, 0)
    d2 = iso_to_gregorian(year, week, 6)
    d3 = datetime.datetime(d1.year, d1.month, d1.day, 0,0,0,0)
    d4 = datetime.datetime(d2.year, d2.month, d2.day, 23,59,59,999999)
    return (d3,d4)
例如:

>>> d = datetime.datetime(2013, 8, 15, 12, 0, 0)
>>> print week_start_end(d)
(datetime.datetime(2013, 8, 11, 0, 0), datetime.datetime(2013, 8, 17, 23, 59, 59, 999999))

而且应该能帮助你解决问题。

你知道几周已经过去了吗?比如2015年的第四周等等。我认为你应该在你的代码中使用它。您可能需要这些范围来进行比较。如果确实需要,请阅读有关
datetime.timedelta
。找到两个星期一00:00,并将后一个与
@KrzysztofSzularz:进行比较,至少有3种不同的规则定义了世界各地使用的一年中的第一周。@JanHudec,如果您对datetime对象进行操作,并且使用python的方法来确定这一点,您将永远是正确的。
strtime
是一种类方法。它不会填充发票的其余字段。你必须自己修改分解的日期表示。@KrzysztofSzularz:是的,当然。嘿,谢谢Tony。你可能想把这些文档作为一个向导来查看。