পাইথনে খেজুরের বিস্তৃত অংশের মধ্য দিয়ে আইট্রেট করা


367

এটি করার জন্য আমার কাছে নিম্নোক্ত কোড রয়েছে তবে আমি কীভাবে এটি আরও ভাল করতে পারি? এই মুহুর্তে আমি মনে করি এটি নেস্টেড লুপগুলির চেয়ে ভাল, তবে আপনি যখন কোনও তালিকা বোধে জেনারেটর রাখেন তখন এটি পার্ল-ওয়ান-লাইনারিশ পেতে শুরু করে।

day_count = (end_date - start_date).days + 1
for single_date in [d for d in (start_date + timedelta(n) for n in range(day_count)) if d <= end_date]:
    print strftime("%Y-%m-%d", single_date.timetuple())

মন্তব্য

  • আমি আসলে এটি মুদ্রণের জন্য ব্যবহার করছি না। এটি কেবল ডেমো উদ্দেশ্যে for
  • start_dateএবং end_dateভেরিয়েবল datetime.dateকারণ আমি টাইমস্ট্যাম্প প্রয়োজন হবে না বস্তু। (এগুলি একটি প্রতিবেদন তৈরি করতে ব্যবহৃত হবে)।

নমুনা আউটপুট

আরম্ভের তারিখ 2009-05-30এবং শেষের তারিখের জন্য 2009-06-09:

2009-05-30
2009-05-31
2009-06-01
2009-06-02
2009-06-03
2009-06-04
2009-06-05
2009-06-06
2009-06-07
2009-06-08
2009-06-09

3
কেবল উল্লেখ করার জন্য: আমি মনে করি না যে 'টাইম.স্ট্রিটাইম ("% ওয়াই-% মি-% ডি", সিঙ্গল_ডেট.টাইমুপে ())' এবং সংক্ষিপ্ত 'সিঙ্গল_ডেট.স্ট্রিটাইম ("% Y-%) এম-% d টি ")। বেশিরভাগ উত্তরগুলি লম্বা স্টাইলটি অনুলিপি করে বলে মনে হচ্ছে।
মি মাইন্ড

8
বাহ, এই উত্তরগুলি অনেক জটিল। এটি ব্যবহার করে দেখুন: স্ট্যাকওভারফ্লো.com
74২72৪২67

@ গ্রিংসুয়েভ: শন কাভানাঘের উত্তর সম্পর্কে কী জটিল ?
jfs

অ্যাপ্লিকেশন: GitHub ধাত প্রতারণা: stackoverflow.com/questions/20099235/...
সিরো Santilli郝海东冠状病六四事件法轮功

1
সদৃশ বা না, আপনি অন্য পৃষ্ঠায় একটি সহজ উত্তর পাবেন।
গ্রিংগো সুভেভ

উত্তর:


552

দুটি নেস্টেড পুনরাবৃত্তি কেন? আমার জন্য এটি কেবল একই পুনরাবৃত্তির সাথে একই তালিকার ডেটা তৈরি করে:

for single_date in (start_date + timedelta(n) for n in range(day_count)):
    print ...

এবং কোনও তালিকা সংরক্ষণ করা হয় না, শুধুমাত্র একটি জেনারেটর পুনরাবৃত্তি হয়। জেনারেটরে থাকা "যদি" অপ্রয়োজনীয় বলে মনে হয়।

সর্বোপরি, একটি রৈখিক ক্রমের জন্য কেবল একটি পুনরুক্তি প্রয়োজন, দুটি নয়।

জন মাচিনের সাথে আলোচনার পরে আপডেট করুন:

হতে পারে সবচেয়ে মার্জিত সমাধানটি জেনারেটর ফাংশনটি সম্পূর্ণরূপে তারিখের সীমাতে পুনরাবৃত্তি / বিমূর্তকরণ গোপন করতে ব্যবহার করে:

from datetime import timedelta, date

def daterange(start_date, end_date):
    for n in range(int ((end_date - start_date).days)):
        yield start_date + timedelta(n)

start_date = date(2013, 1, 1)
end_date = date(2015, 6, 2)
for single_date in daterange(start_date, end_date):
    print(single_date.strftime("%Y-%m-%d"))

নোট: অন্তর্নির্মিত range()ফাংশনটির সাথে ধারাবাহিকতার জন্য এই পুনরাবৃত্তিটি পৌঁছানোর আগে থামে end_date। সুতরাং অন্তর্ভুক্তি পুনরাবৃত্তির জন্য পরের দিন ব্যবহার করুন, যেমনটি আপনি করেছিলেন range()


4
-১ ... ডে_কাউন্টের প্রাথমিক গণনা করা এবং ব্যাপ্তি ব্যবহার করা যখন দুর্দান্ত হয় তখন লুপটি যথেষ্ট হয় না।
জন মাচিন

7
@ জন মাচিন: ঠিক আছে। কিছু পাল্টা বা মানের সুস্পষ্ট বর্ধনের সাথে লুপগুলি বজায় রাখার সময় আমি একটি পুনরাবৃত্তিটি প্রেরণ করি। ইন্টিগ্রেশন প্যাটার্নটি বেশি পাইথোনিক (কমপক্ষে আমার ব্যক্তিগত দৃষ্টিভঙ্গিতে) এবং আরও সাধারণ, কারণ এটি কীভাবে পুনরাবৃত্তিটি সম্পন্ন হয় তার বিশদটি গোপন করে একটি পুনরাবৃত্তি প্রকাশ করতে দেয়।
বের

10
@ বের: আমি মোটেও পছন্দ করি না; এটা দু: খজনক। আপনার ইতিমধ্যে একটি পুনরাবৃত্তি ছিল! কোনও জেনারেটরে অভিযোগ সম্পর্কিত কনস্ট্রাক্টগুলি মোড়ানো দ্বারা, আপনি আপনার 3-লাইনারের কোড এবং / অথবা ডকস পড়ার জন্য আরও বেশি নির্বাহের ওভারহেড প্লাস ব্যবহারকারীর মনোযোগ অন্য কোথাও ঘুরিয়ে দিয়েছেন। -2
জন মাচিন

8
@ জন মাচিন: আমি একমত নই পয়েন্টটি সর্বনিম্ন সর্বনিম্নে রেখার সংখ্যা হ্রাস করার বিষয়ে নয়। সর্বোপরি, আমরা এখানে পার্ল কথা বলছি না। এছাড়াও, আমার কোডটি কেবল একটি পুনরাবৃত্তি করে (এটি জেনারেটর কীভাবে কাজ করে তবে আমি অনুমান করি আপনি এটি জানেন)। *** আমার বক্তব্যটি পুনরায় ব্যবহার এবং স্ব-ব্যাখ্যামূলক কোডের জন্য বিমূর্ত ধারণা সম্পর্কে। আমি মনে করি যে সংক্ষিপ্ততম কোডটি সম্ভব হওয়ার চেয়ে এটি অনেক বেশি সার্থক।
বের

9
আপনি যদি নির্লজ্জতার জন্য যাচ্ছেন তবে আপনি একটি জেনারেটর এক্সপ্রেশন ব্যবহার করতে পারেন:(start_date + datetime.timedelta(n) for n in range((end_date - start_date).days))
মার্ক রান্সম

219

এটি আরও পরিষ্কার হতে পারে:

from datetime import date, timedelta

start_date = date(2019, 1, 1)
end_date = date(2020, 1, 1)
delta = timedelta(days=1)
while start_date <= end_date:
    print (start_date.strftime("%Y-%m-%d"))
    start_date += delta

3
খুব স্পষ্ট এবং সংক্ষিপ্ত, তবে আপনি যদি চালিয়ে যেতে চান তবে ভাল কাজ করে না
rslite

আমার ব্যবহারের ক্ষেত্রে খুব সুন্দর কাজ করে
ডুমডাম

169

dateutilগ্রন্থাগারটি ব্যবহার করুন :

from datetime import date
from dateutil.rrule import rrule, DAILY

a = date(2009, 5, 30)
b = date(2009, 6, 9)

for dt in rrule(DAILY, dtstart=a, until=b):
    print dt.strftime("%Y-%m-%d")

এই অজগর লাইব্রেরিতে আরও অনেক উন্নত বৈশিষ্ট্য রয়েছে, কিছু খুব দরকারী যেমন relative deltaএস — এবং একটি একক ফাইল (মডিউল) হিসাবে প্রয়োগ করা হয় যা সহজেই একটি প্রকল্পের মধ্যে অন্তর্ভুক্ত হয়।


3
মনে রাখবেন যে, লুপ এখানে চূড়ান্ত তারিখ সমেত এর untilযেহেতু চূড়ান্ত তারিখdaterange পদ্ধতি BER এর উত্তর হল একচেটিয়া এর end_date
নিনজাকাননন


77

পান্ডাস সাধারণভাবে সময় সিরিজের জন্য দুর্দান্ত, এবং তারিখ ব্যাপ্তির জন্য সরাসরি সমর্থন রয়েছে।

import pandas as pd
daterange = pd.date_range(start_date, end_date)

তারপরে আপনি তারিখটি মুদ্রণের জন্য ডেটরেঞ্জের উপর লুপ করতে পারেন:

for single_date in daterange:
    print (single_date.strftime("%Y-%m-%d"))

জীবনকে সহজ করার জন্য এর প্রচুর বিকল্প রয়েছে। উদাহরণস্বরূপ, যদি আপনি কেবল সপ্তাহের দিনগুলি চান, আপনি কেবল বিডেট_রেঞ্জে স্যুইপ করবেন। Http://pandas.pydata.org/pandas-docs/stable/Timeseries.html# জেনারেটিং- রেঞ্জস- টাইমস্ট্যাম্পগুলি দেখুন

পান্ডার শক্তি হ'ল এটির ডেটাফ্রেমগুলি, যা ভেক্টরাইজড অপারেশনগুলিকে সমর্থন করে (অনেকটা বোকার মতো) যা প্রচুর পরিমাণে ডেটা জুড়ে অপারেশনটিকে খুব দ্রুত এবং সহজ করে তোলে।

সম্পাদনা: আপনি লুপের জন্য পুরোপুরি এড়িয়ে যেতে পারেন এবং কেবল এটি সরাসরি মুদ্রণ করতে পারেন যা সহজ এবং আরও কার্যকর:

print(daterange)

"অনেকটা অদ্ভুতের মতো" - পান্ডাগুলি অলপকে তৈরি করা হয়েছে: পি
জ্যাচ

15
import datetime

def daterange(start, stop, step=datetime.timedelta(days=1), inclusive=False):
  # inclusive=False to behave like range by default
  if step.days > 0:
    while start < stop:
      yield start
      start = start + step
      # not +=! don't modify object passed in if it's mutable
      # since this function is not restricted to
      # only types from datetime module
  elif step.days < 0:
    while start > stop:
      yield start
      start = start + step
  if inclusive and start == stop:
    yield start

# ...

for date in daterange(start_date, end_date, inclusive=True):
  print strftime("%Y-%m-%d", date.timetuple())

নেতিবাচক পদক্ষেপ ইত্যাদিকে সমর্থন করে এই ফাংশনটি আপনার কঠোরভাবে প্রয়োজনের চেয়ে আরও বেশি কিছু করে, যতক্ষণ আপনি আপনার পরিসীমা যুক্তি নির্ধারণ করেন, ততক্ষণ আপনার আলাদা প্রয়োজন হয় না day_countএবং গুরুত্বপূর্ণভাবে আপনি একাধিক থেকে ফাংশনটি কল করার সাথে সাথে কোডটি পড়া সহজ হয় becomes জায়গা.


ধন্যবাদ, আরও সান্নিধ্যের সাথে পরিসীমাটির পরামিতিগুলির পুনরায় নামকরণ করা হয়েছে, দেহে পরিবর্তন করতে ভুলে গেছেন।

+1 ... তবে আপনি যখন পদক্ষেপটিকে টাইমডেল্টা হিসাবে অনুমতি দিচ্ছেন, আপনার (ক) এটি ডেটটাইমেনজ () বলা উচিত এবং টাইমডেল্টা (ঘন্টা = 12) এবং টাইমডেল্টা (ঘন্টা = 36) সঠিকভাবে কাজ করার জন্য বা ( খ) ফাঁদ পদক্ষেপগুলি যেগুলি অবিচ্ছেদ্য সংখ্যক দিন নয় বা (গ) কলারকে ঝামেলা বাঁচায় এবং একটি সময়সীমা পরিবর্তে কয়েক দিন হিসাবে পদক্ষেপটি প্রকাশ করবে।
জন মাচিন

যে কোনও টাইমডেল্টা ইতিমধ্যে কাজ করা উচিত, তবে আমি (ক) এর কারণে এটি লেখার পরে আমার ব্যক্তিগত স্ক্র্যাপ সংগ্রহের সাথে ডেটটাইম_আরঞ্জ এবং ডেট_আরঞ্জ যোগ করেছি। নিশ্চিত হবেন না (গ) এর জন্য অন্য কোনও কার্য সার্থক, দিনগুলির সবচেয়ে সাধারণ ক্ষেত্রে = 1 এরই মধ্যে যত্ন নেওয়া হয়েছে এবং স্পষ্টভাবে টাইমডেল্টা পাস করার কারণে বিভ্রান্তি এড়ানো যায়। সম্ভবত এটি কোথাও আপলোড করা সেরা: bitbucket.org/kniht/scraps/src/tip/python/gen_range.py

দিনগুলি ব্যতীত ইনক্রিমেন্টে এই কাজটি করার জন্য আপনার পদক্ষেপ.টোটাল_সেকেন্ডস () এর বিরুদ্ধে পরীক্ষা করা উচিত, এবং পদক্ষেপের দিন নয়
amohr

12

আমি ভাবতে পারি এটি সবচেয়ে মানব-পঠনযোগ্য সমাধান।

import datetime

def daterange(start, end, step=datetime.timedelta(1)):
    curr = start
    while curr < end:
        yield curr
        curr += step

11

কেন চেষ্টা করছ না:

import datetime as dt

start_date = dt.datetime(2012, 12,1)
end_date = dt.datetime(2012, 12,5)

total_days = (end_date - start_date).days + 1 #inclusive 5 days

for day_number in range(total_days):
    current_date = (start_date + dt.timedelta(days = day_number)).date()
    print current_date

7

নম্পির arangeকাজগুলি তারিখগুলিতে প্রয়োগ করা যেতে পারে:

import numpy as np
from datetime import datetime, timedelta
d0 = datetime(2009, 1,1)
d1 = datetime(2010, 1,1)
dt = timedelta(days = 1)
dates = np.arange(d0, d1, dt).astype(datetime)

এর ব্যবহার astypeহ'ল অবজেক্টের numpy.datetime64অ্যারে থেকে রূপান্তর করা datetime.datetime


সুপার হিম নির্মাণ! শেষ লাইনটি আমার সাথে কাজ করেdates = np.arange(d0, d1, dt).astype(datetime.datetime)
পায়ানো

জেনেরিক ওয়ান-লাইনার সলিউশন পোস্ট করার জন্য +1 যা কোনও টাইমডেল্টাকে মঞ্জুরি দেয় / ঘণ্টা / মিনিট /… এর মতো নির্দিষ্ট গোলাকার ধাপের পরিবর্তে যে কোনও টাইমডেল্টাকে অনুমতি দেয়।
এফ.রাব

7

আজ থেকে শেষ n দিনগুলি দেখান:

import datetime
for i in range(0, 100):
    print((datetime.date.today() + datetime.timedelta(i)).isoformat())

আউটপুট:

2016-06-29
2016-06-30
2016-07-01
2016-07-02
2016-07-03
2016-07-04

দয়া করে বৃত্তাকার বন্ধনী যুক্ত করুন, যেমনprint((datetime.date.today() + datetime.timedelta(i)).isoformat())
টাইটানফাইটার

@ টাইটানফাইটার দয়া করে নির্দ্বিধায় সম্পাদনা করুন, আমি সেগুলি গ্রহণ করব।
ব্যবহারকারী 1767754

2
আমি চেষ্টা করেছিলাম. সম্পাদনার জন্য সর্বনিম্ন 6 টি অক্ষর প্রয়োজন, তবে এই ক্ষেত্রে কেবল 2 টি অক্ষর যুক্ত করা প্রয়োজন, "(" এবং ")"
টাইটানফাইটার

print((datetime.date.today() + datetime.timedelta(i))).isoformat ব্যতীত () ঠিক একই আউটপুট দেয়। ওয়াইওয়াইএমএমডিডি প্রিন্ট করার জন্য আমার স্ক্রিপ্টটি দরকার। কেউ কীভাবে তা করতে জানেন?
mr.zog

মুদ্রণ বিবৃতিটির পরিবর্তে লুপের জন্য এটি করুনd = datetime.date.today() + datetime.timedelta(i); d.strftime("%Y%m%d")
ব্যবহারকারীর 1767754

5
import datetime

def daterange(start, stop, step_days=1):
    current = start
    step = datetime.timedelta(step_days)
    if step_days > 0:
        while current < stop:
            yield current
            current += step
    elif step_days < 0:
        while current > stop:
            yield current
            current += step
    else:
        raise ValueError("daterange() step_days argument must not be zero")

if __name__ == "__main__":
    from pprint import pprint as pp
    lo = datetime.date(2008, 12, 27)
    hi = datetime.date(2009, 1, 5)
    pp(list(daterange(lo, hi)))
    pp(list(daterange(hi, lo, -1)))
    pp(list(daterange(lo, hi, 7)))
    pp(list(daterange(hi, lo, -7))) 
    assert not list(daterange(lo, hi, -1))
    assert not list(daterange(hi, lo))
    assert not list(daterange(lo, hi, -7))
    assert not list(daterange(hi, lo, 7)) 


4

সম্পূর্ণতার জন্য, পান্ডার period_rangeটাইমস্ট্যাম্পগুলির সীমাবদ্ধতার বাইরেও রয়েছে:

import pandas as pd

pd.period_range(start='1/1/1626', end='1/08/1627', freq='D')

3

আমার একই রকম সমস্যা আছে তবে আমার দৈনিকের পরিবর্তে মাসিক পুনরাবৃত্তি করা দরকার।

এটা আমার সমাধান

import calendar
from datetime import datetime, timedelta

def days_in_month(dt):
    return calendar.monthrange(dt.year, dt.month)[1]

def monthly_range(dt_start, dt_end):
    forward = dt_end >= dt_start
    finish = False
    dt = dt_start

    while not finish:
        yield dt.date()
        if forward:
            days = days_in_month(dt)
            dt = dt + timedelta(days=days)            
            finish = dt > dt_end
        else:
            _tmp_dt = dt.replace(day=1) - timedelta(days=1)
            dt = (_tmp_dt.replace(day=dt.day))
            finish = dt < dt_end

উদাহরণ # 1

date_start = datetime(2016, 6, 1)
date_end = datetime(2017, 1, 1)

for p in monthly_range(date_start, date_end):
    print(p)

আউটপুট

2016-06-01
2016-07-01
2016-08-01
2016-09-01
2016-10-01
2016-11-01
2016-12-01
2017-01-01

উদাহরণ # 2

date_start = datetime(2017, 1, 1)
date_end = datetime(2016, 6, 1)

for p in monthly_range(date_start, date_end):
    print(p)

আউটপুট

2017-01-01
2016-12-01
2016-11-01
2016-10-01
2016-09-01
2016-08-01
2016-07-01
2016-06-01

3

পারি 'টি * একটি সহজ রিকার্সিভ ফাংশন পরামর্শ যে কেউ ছাড়া বিশ্বাস করেন যে এই প্রশ্ন 9 বছর অস্তিত্ত্বকে করেছেন:

from datetime import datetime, timedelta

def walk_days(start_date, end_date):
    if start_date <= end_date:
        print(start_date.strftime("%Y-%m-%d"))
        next_date = start_date + timedelta(days=1)
        walk_days(next_date, end_date)

#demo
start_date = datetime(2009, 5, 30)
end_date   = datetime(2009, 6, 9)

walk_days(start_date, end_date)

আউটপুট:

2009-05-30
2009-05-31
2009-06-01
2009-06-02
2009-06-03
2009-06-04
2009-06-05
2009-06-06
2009-06-07
2009-06-08
2009-06-09

সম্পাদনা: * এখন আমি এটি বিশ্বাস করতে পারি - দেখুন পাইথন কি লেজ পুনরাবৃত্তিকে অনুকূল করে তোলে? । আপনাকে ধন্যবাদ টিম


3
আপনি কেন পুনরাবৃত্তি সহ একটি সাধারণ লুপ প্রতিস্থাপন করবেন? এটি প্রায় দুই থেকে আড়াই বছরের বেশি দীর্ঘ রেঞ্জগুলির জন্য বিরতি দেয়।
টিম-এরউইন

@ টিম-আরউইন সত্যই আমার ধারণা ছিল না সিপিথন লেজ পুনরাবৃত্তি অনুকূলিত করে না যাতে আপনার মন্তব্য মূল্যবান।
পকেটস্যান্ড

2

আপনি সহজলভ্যভাবে এবং বিশ্বস্তভাবে পান্ডাস লাইব্রেরি ব্যবহার করে দুটি তারিখের মধ্যে তারিখের একটি সিরিজ তৈরি করতে পারেন

import pandas as pd

print pd.date_range(start='1/1/2010', end='1/08/2018', freq='M')

আপনি ডি, এম, কিউ, ওয়াই (দৈনিক, মাসিক, ত্রৈমাসিক, বার্ষিক) হিসাবে ফ্রেিক সেট করে তারিখগুলি উত্পন্ন করার ফ্রিকোয়েন্সি পরিবর্তন করতে পারেন


ইতিমধ্যে 2014 এ থ্রেডে উত্তর দেওয়া হয়েছে
আলেক্সি ওয়াজনভ

2
> pip install DateTimeRange

from datetimerange import DateTimeRange

def dateRange(start, end, step):
        rangeList = []
        time_range = DateTimeRange(start, end)
        for value in time_range.range(datetime.timedelta(days=step)):
            rangeList.append(value.strftime('%m/%d/%Y'))
        return rangeList

    dateRange("2018-09-07", "2018-12-25", 7)  

    Out[92]: 
    ['09/07/2018',
     '09/14/2018',
     '09/21/2018',
     '09/28/2018',
     '10/05/2018',
     '10/12/2018',
     '10/19/2018',
     '10/26/2018',
     '11/02/2018',
     '11/09/2018',
     '11/16/2018',
     '11/23/2018',
     '11/30/2018',
     '12/07/2018',
     '12/14/2018',
     '12/21/2018']

1

এই ফাংশনে কিছু অতিরিক্ত বৈশিষ্ট্য রয়েছে:

  • শুরু বা শেষের জন্য DATE_FORMAT এর সাথে মিলে একটি স্ট্রিং পাস করতে পারে এবং এটি একটি তারিখের অবজেক্টে রূপান্তরিত হয়
  • শুরু বা শেষের জন্য একটি তারিখ অবজেক্ট পাস করতে পারে
  • প্রারম্ভের চেয়ে শেষটি বড় হওয়ার ক্ষেত্রে ত্রুটি পরীক্ষা করা

    import datetime
    from datetime import timedelta
    
    
    DATE_FORMAT = '%Y/%m/%d'
    
    def daterange(start, end):
          def convert(date):
                try:
                      date = datetime.datetime.strptime(date, DATE_FORMAT)
                      return date.date()
                except TypeError:
                      return date
    
          def get_date(n):
                return datetime.datetime.strftime(convert(start) + timedelta(days=n), DATE_FORMAT)
    
          days = (convert(end) - convert(start)).days
          if days <= 0:
                raise ValueError('The start date must be before the end date.')
          for n in range(0, days):
                yield get_date(n)
    
    
    start = '2014/12/1'
    end = '2014/12/31'
    print list(daterange(start, end))
    
    start_ = datetime.date.today()
    end = '2015/12/1'
    print list(daterange(start, end))

1

বারের উত্তরের সমান একটি সাধারণ তারিখের পরিসীমা ফাংশনের কোড এখানে, তবে আরও নমনীয়:

def count_timedelta(delta, step, seconds_in_interval):
    """Helper function for iterate.  Finds the number of intervals in the timedelta."""
    return int(delta.total_seconds() / (seconds_in_interval * step))


def range_dt(start, end, step=1, interval='day'):
    """Iterate over datetimes or dates, similar to builtin range."""
    intervals = functools.partial(count_timedelta, (end - start), step)

    if interval == 'week':
        for i in range(intervals(3600 * 24 * 7)):
            yield start + datetime.timedelta(weeks=i) * step

    elif interval == 'day':
        for i in range(intervals(3600 * 24)):
            yield start + datetime.timedelta(days=i) * step

    elif interval == 'hour':
        for i in range(intervals(3600)):
            yield start + datetime.timedelta(hours=i) * step

    elif interval == 'minute':
        for i in range(intervals(60)):
            yield start + datetime.timedelta(minutes=i) * step

    elif interval == 'second':
        for i in range(intervals(1)):
            yield start + datetime.timedelta(seconds=i) * step

    elif interval == 'millisecond':
        for i in range(intervals(1 / 1000)):
            yield start + datetime.timedelta(milliseconds=i) * step

    elif interval == 'microsecond':
        for i in range(intervals(1e-6)):
            yield start + datetime.timedelta(microseconds=i) * step

    else:
        raise AttributeError("Interval must be 'week', 'day', 'hour' 'second', \
            'microsecond' or 'millisecond'.")

0

দিনগুলি দ্বারা বর্ধিত পরিসীমা করার জন্য নিম্নলিখিতগুলি সম্পর্কে কী:

for d in map( lambda x: startDate+datetime.timedelta(days=x), xrange( (stopDate-startDate).days ) ):
  # Do stuff here
  • স্টার্টডেট এবং স্টপডেট হ'ল ডেটটাইম.ডেট অবজেক্ট

জেনেরিক সংস্করণের জন্য:

for d in map( lambda x: startTime+x*stepTime, xrange( (stopTime-startTime).total_seconds() / stepTime.total_seconds() ) ):
  # Do stuff here
  • স্টার্টটাইম এবং স্টপটাইম হ'ল ডেটটাইম.ডেট বা ডেটটাইম.ডেটটাইম অবজেক্ট (উভয়ই একই ধরণের হওয়া উচিত)
  • স্টেপটাইম একটি টাইমডেল্টা অবজেক্ট

দ্রষ্টব্য যে .টোটাল_সেকেন্ডস () কেবলমাত্র অজগর ২. after এর পরে সমর্থিত যদি আপনি পূর্ববর্তী সংস্করণে আটকে থাকেন তবে আপনি নিজের ফাংশনটি লিখতে পারেন:

def total_seconds( td ):
  return float(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6

0

টিপলটিতে rangeআরোগুলি সংরক্ষণ করে বিপরীতমুখী পদক্ষেপের জন্য সামান্য ভিন্ন পদ্ধতির ।

def date_range(start, stop, step=1, inclusive=False):
    day_count = (stop - start).days
    if inclusive:
        day_count += 1

    if step > 0:
        range_args = (0, day_count, step)
    elif step < 0:
        range_args = (day_count - 1, -1, step)
    else:
        raise ValueError("date_range(): step arg must be non-zero")

    for i in range(*range_args):
        yield start + timedelta(days=i)

0
import datetime
from dateutil.rrule import DAILY,rrule

date=datetime.datetime(2019,1,10)

date1=datetime.datetime(2019,2,2)

for i in rrule(DAILY , dtstart=date,until=date1):
     print(i.strftime('%Y%b%d'),sep='\n')

আউটপুট:

2019Jan10
2019Jan11
2019Jan12
2019Jan13
2019Jan14
2019Jan15
2019Jan16
2019Jan17
2019Jan18
2019Jan19
2019Jan20
2019Jan21
2019Jan22
2019Jan23
2019Jan24
2019Jan25
2019Jan26
2019Jan27
2019Jan28
2019Jan29
2019Jan30
2019Jan31
2019Feb01
2019Feb02

স্ট্যাক ওভারফ্লোতে স্বাগতম! যদিও এই কোডটি কীভাবে এবং কেন এই সমস্যার সমাধান করে, বিশেষত অনেকগুলি ভাল উত্তরের প্রশ্নগুলিতে এই সমস্যার সমাধান সহ প্রশ্নটির সমাধান করতে পারে তবে আপনার পোস্টের গুণমান উন্নত করতে সত্যই সহায়তা করবে এবং সম্ভবত আরও উন্নতি হতে পারে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, কেবল এখনই জিজ্ঞাসা করা ব্যক্তি নয়। দয়া করে সম্পাদনা ব্যাখ্যা যোগ করতে পারেন এবং সীমাবদ্ধতা এবং অনুমানের কি প্রয়োগ একটি ইঙ্গিত দিতে আপনার উত্তর। পর্যালোচনা থেকে
ডাবল-বীপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.