Tho*_*wne 315 python datetime date
我想创建一个日期列表,从今天开始,然后返回任意天数,例如,在我的例子中100天.有没有比这更好的方法呢?
import datetime
a = datetime.datetime.today()
numdays = 100
dateList = []
for x in range (0, numdays):
dateList.append(a - datetime.timedelta(days = x))
print dateList
Run Code Online (Sandbox Code Playgroud)
S.L*_*ott 409
边缘更好......
base = datetime.datetime.today()
date_list = [base - datetime.timedelta(days=x) for x in range(numdays)]
Run Code Online (Sandbox Code Playgroud)
fan*_*ous 204
Pandas
非常适合时间序列,并且直接支持日期范围.
import pandas as pd
datelist = pd.date_range(pd.datetime.today(), periods=100).tolist()
Run Code Online (Sandbox Code Playgroud)
它还有很多选项可以让生活更轻松.例如,如果你只想要工作日,你只需要交换bdate_range
.
见http://pandas.pydata.org/pandas-docs/stable/timeseries.html#generating-ranges-of-timestamps
此外,它完全支持pytz时区,可以顺利跨越春/秋季DST班次.
San*_*eep 61
获取指定开始日期和结束日期之间的日期范围(针对时间和空间复杂度进行了优化):
import datetime
start = datetime.datetime.strptime("21-06-2014", "%d-%m-%Y")
end = datetime.datetime.strptime("07-07-2014", "%d-%m-%Y")
date_generated = [start + datetime.timedelta(days=x) for x in range(0, (end-start).days)]
for date in date_generated:
print date.strftime("%d-%m-%Y")
Run Code Online (Sandbox Code Playgroud)
Aym*_*ieh 42
您可以编写一个从今天开始返回日期对象的生成器函数:
import datetime
def date_generator():
from_date = datetime.datetime.today()
while True:
yield from_date
from_date = from_date - datetime.timedelta(days=1)
Run Code Online (Sandbox Code Playgroud)
此生成器从今天开始返回日期,一次向后返回一天.以下是前3个日期:
>>> import itertools
>>> dates = itertools.islice(date_generator(), 3)
>>> list(dates)
[datetime.datetime(2009, 6, 14, 19, 12, 21, 703890), datetime.datetime(2009, 6, 13, 19, 12, 21, 703890), datetime.datetime(2009, 6, 12, 19, 12, 21, 703890)]
Run Code Online (Sandbox Code Playgroud)
这种方法优于循环或列表理解的优点是您可以根据需要返回多次.
编辑
使用生成器表达式而不是函数的更紧凑的版本:
date_generator = (datetime.datetime.today() - datetime.timedelta(days=i) for i in itertools.count())
Run Code Online (Sandbox Code Playgroud)
用法:
>>> dates = itertools.islice(date_generator, 3)
>>> list(dates)
[datetime.datetime(2009, 6, 15, 1, 32, 37, 286765), datetime.datetime(2009, 6, 14, 1, 32, 37, 286836), datetime.datetime(2009, 6, 13, 1, 32, 37, 286859)]
Run Code Online (Sandbox Code Playgroud)
Hos*_*ane 31
您还可以使用day ordinal使其更简单:
def date_range(start_date, end_date):
for ordinal in range(start_date.toordinal(), end_date.toordinal()):
yield datetime.date.fromordinal(ordinal)
Run Code Online (Sandbox Code Playgroud)
或者按照评论中的建议,您可以创建如下列表:
date_range = [
datetime.date.fromordinal(ordinal)
for ordinal in range(
start_date.toordinal(),
end_date.toordinal(),
)
]
Run Code Online (Sandbox Code Playgroud)
小智 28
是的,重新发明轮子....只是搜索论坛,你会得到这样的东西:
from dateutil import rrule
from datetime import datetime
list(rrule.rrule(rrule.DAILY,count=100,dtstart=datetime.now()))
Run Code Online (Sandbox Code Playgroud)
sna*_*mer 15
从这个问题的标题我希望找到类似的东西range()
,这将让我指定两个日期并创建一个列表,其中包含所有日期.这样,如果事先不知道,那么就不需要计算这两个日期之间的天数.
因此,由于存在略微偏离主题的风险,这个单线工作完成了这项工作:
import datetime
start_date = datetime.date(2011, 01, 01)
end_date = datetime.date(2014, 01, 01)
dates_2011_2013 = [ start_date + datetime.timedelta(n) for n in range(int ((end_date - start_date).days))]
Run Code Online (Sandbox Code Playgroud)
这个答案的所有功劳!
小智 10
这里有一个稍微不同的答案美国洛特的回答,让两个日期之间的日期列表的建设关start
和end
。在下面的示例中,从2017年初到今天。
start = datetime.datetime(2017,1,1)
end = datetime.datetime.today()
daterange = [start + datetime.timedelta(days=x) for x in range(0, (end-start).days)]
Run Code Online (Sandbox Code Playgroud)
我知道有点迟到的答案,但我遇到了同样的问题,并且认为Python的内部范围函数在这方面有点缺乏,所以我在我的util模块中重写了它.
from __builtin__ import range as _range
from datetime import datetime, timedelta
def range(*args):
if len(args) != 3:
return _range(*args)
start, stop, step = args
if start < stop:
cmp = lambda a, b: a < b
inc = lambda a: a + step
else:
cmp = lambda a, b: a > b
inc = lambda a: a - step
output = [start]
while cmp(start, stop):
start = inc(start)
output.append(start)
return output
print range(datetime(2011, 5, 1), datetime(2011, 10, 1), timedelta(days=30))
Run Code Online (Sandbox Code Playgroud)
小智 6
如果有两个日期,并且您需要范围,请尝试
from dateutil import rrule, parser
date1 = '1995-01-01'
date2 = '1995-02-28'
datesx = list(rrule.rrule(rrule.DAILY, dtstart=parser.parse(date1), until=parser.parse(date2)))
Run Code Online (Sandbox Code Playgroud)
这是我创建的要点,从我自己的代码,这可能会有所帮助.(我知道这个问题太旧了,但其他人可以使用它)
https://gist.github.com/2287345
(下同)
import datetime
from time import mktime
def convert_date_to_datetime(date_object):
date_tuple = date_object.timetuple()
date_timestamp = mktime(date_tuple)
return datetime.datetime.fromtimestamp(date_timestamp)
def date_range(how_many=7):
for x in range(0, how_many):
some_date = datetime.datetime.today() - datetime.timedelta(days=x)
some_datetime = convert_date_to_datetime(some_date.date())
yield some_datetime
def pick_two_dates(how_many=7):
a = b = convert_date_to_datetime(datetime.datetime.now().date())
for each_date in date_range(how_many):
b = a
a = each_date
if a == b:
continue
yield b, a
Run Code Online (Sandbox Code Playgroud)
根据我为自己写的答案:
import datetime;
print [(datetime.date.today() - datetime.timedelta(days=x)).strftime('%Y-%m-%d') for x in range(-5, 0)]
Run Code Online (Sandbox Code Playgroud)
输出:
['2017-12-11', '2017-12-10', '2017-12-09', '2017-12-08', '2017-12-07']
Run Code Online (Sandbox Code Playgroud)
区别在于我得到的是' date
'对象,而不是' datetime.datetime
'一个对象。
一种通用方法,允许根据参数化窗口大小(日、分钟、小时、秒)创建日期范围:
from datetime import datetime, timedelta
def create_date_ranges(start, end, **interval):
start_ = start
while start_ < end:
end_ = start_ + timedelta(**interval)
yield (start_, min(end_, end))
start_ = end_
Run Code Online (Sandbox Code Playgroud)
测试:
def main():
tests = [
('2021-11-15:00:00:00', '2021-11-17:13:00:00', {'days': 1}),
('2021-11-15:00:00:00', '2021-11-16:13:00:00', {'hours': 12}),
('2021-11-15:00:00:00', '2021-11-15:01:45:00', {'minutes': 30}),
('2021-11-15:00:00:00', '2021-11-15:00:01:12', {'seconds': 30})
]
for t in tests:
print("\nInterval: %s, range(%s to %s)" % (t[2], t[0], t[1]))
start = datetime.strptime(t[0], '%Y-%m-%d:%H:%M:%S')
end = datetime.strptime(t[1], '%Y-%m-%d:%H:%M:%S')
ranges = list(create_date_ranges(start, end, **t[2]))
x = list(map(
lambda x: (x[0].strftime('%Y-%m-%d:%H:%M:%S'), x[1].strftime('%Y-%m-%d:%H:%M:%S')),
ranges
))
print(x)
main()
Run Code Online (Sandbox Code Playgroud)
测试输出:
Interval: {'days': 1}, range(2021-11-15:00:00:00 to 2021-11-17:13:00:00)
[('2021-11-15:00:00:00', '2021-11-16:00:00:00'), ('2021-11-16:00:00:00', '2021-11-17:00:00:00'), ('2021-11-17:00:00:00', '2021-11-17:13:00:00')]
Interval: {'hours': 12}, range(2021-11-15:00:00:00 to 2021-11-16:13:00:00)
[('2021-11-15:00:00:00', '2021-11-15:12:00:00'), ('2021-11-15:12:00:00', '2021-11-16:00:00:00'), ('2021-11-16:00:00:00', '2021-11-16:12:00:00'), ('2021-11-16:12:00:00', '2021-11-16:13:00:00')]
Interval: {'minutes': 30}, range(2021-11-15:00:00:00 to 2021-11-15:01:45:00)
[('2021-11-15:00:00:00', '2021-11-15:00:30:00'), ('2021-11-15:00:30:00', '2021-11-15:01:00:00'), ('2021-11-15:01:00:00', '2021-11-15:01:30:00'), ('2021-11-15:01:30:00', '2021-11-15:01:45:00')]
Interval: {'seconds': 30}, range(2021-11-15:00:00:00 to 2021-11-15:00:01:12)
[('2021-11-15:00:00:00', '2021-11-15:00:00:30'), ('2021-11-15:00:00:30', '2021-11-15:00:01:00'), ('2021-11-15:00:01:00', '2021-11-15:00:01:12')]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
343775 次 |
最近记录: |