পাইথনে খেজুরের ব্যাপ্তি তৈরি


373

আমি আজ থেকে শুরু করে তারিখগুলির একটি তালিকা তৈরি করতে চাই এবং কয়েক দিন নির্বিচারে ফিরে যেতে চাই, আমার উদাহরণে 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

উত্তর:


458

প্রান্তিকভাবে আরও ভাল ...

base = datetime.datetime.today()
date_list = [base - datetime.timedelta(days=x) for x in range(numdays)]

6
আপনি সময় অঞ্চল সচেতন তারিখের সময়গুলি ব্যবহার করেন এবং এটি ডিএসটি-র পরিবর্তন হয় যদি এটি কার্যকর হয় না !!! আমি বলতে চাইছি, আপনি যখন শুরু এবং শেষের তারিখটি ব্যবহার করেন এবং এটিকে এই ভাবে পূরণ করেন ...
gabn88

@ এস-লট আপনি কেবল range(0, numdays)এই ক্ষেত্রে ব্যবহার করতে পারবেন না ?
লুকাশ জুহরিখ ২

3
আমি এই পদ্ধতিটি কিছুটা ভিন্ন উপায়ে ব্যবহার করেছি, দশ, 5 মিনিটের ব্যবধান, +/- কিছু মান (আমার ক্ষেত্রে 30 সেকেন্ড) উত্পন্ন করতে। আমি কেবল শেয়ার করেছি আমি ভাগ করেছি: datetimes = [start + timedelta(seconds=x*60+randint(-30, 30)) for x in range (0, range_end*5, 5)]যেখানে পরিবর্তনশীলrange_end = 10
মাইকি ই

246

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

উদাহরণস্বরূপ pd.date_range():

import pandas as pd
from datetime import datetime

datelist = pd.date_range(datetime.today(), periods=100).tolist()

জীবনকে সহজ করার জন্য এর প্রচুর বিকল্প রয়েছে। উদাহরণস্বরূপ, যদি আপনি কেবল সপ্তাহের দিনগুলি চান, আপনি কেবল স্যুপ ইন করবেন bdate_range

দেখুন তারিখের ব্যাপ্তি ডকুমেন্টেশন

তদাতিরিক্ত এটি পাইটজ টাইমজোনগুলি সম্পূর্ণরূপে সমর্থন করে এবং সহজেই বসন্ত / শরত্কাল ডিএসটি শিফটগুলি স্প্যান করতে পারে।

ওপি দ্বারা সম্পাদনা করুন:

পান্ডাস টাইমস্ট্যাম্পগুলির বিপরীতে আপনার যদি সত্যিকারের অজগর তারিখের সময় প্রয়োজন:

import pandas as pd
from datetime import datetime

pd.date_range(end = datetime.today(), periods = 100).to_pydatetime().tolist()

#OR

pd.date_range(start="2018-09-09",end="2020-02-02")

এটি মূল প্রশ্নের সাথে মেলে "শেষ" প্যারামিটার ব্যবহার করে তবে আপনি যদি উতরাইয়ের তারিখগুলি চান:

pd.date_range(datetime.today(), periods=100).to_pydatetime().tolist()

22
প্যান্ডাস ইতিমধ্যে ব্যবহার করা হচ্ছে তবে সেরা উত্তরটি ডিফো করুন। কেবলমাত্র আমি যুক্ত করব তা হ'ল যদি আপনার তারিখগুলি মূল পোস্ট অনুসারে পিছনের দিকে চলে যায় তবে আপনি শেষ = প্যারামিটারটি ব্যবহার করবেন। পিডি.ডেট_রেঞ্জ (শেষ = পিডি.ডেটটাইম.টোডে (), পিরিয়ডস = 100) .টোলিস্ট ()
টমাস ব্রাউন

5
এই পদ্ধতিগুলির সাথে একটি সমস্যা হ'ল যখন আপনাকে পাইথন ডেটটাইম টাইপের প্রয়োজন হয় ... পান্ডাস বা নপি ডেট রেঞ্জ পদ্ধতি ব্যবহার করে টাইমস্ট্যাম্প এবং ডেটটাইম 64৪ প্রকার তৈরি হবে ... আপনাকে ডেটটাইম list(map(pd.Timestamp.to_pydatetime, datelist))টাইপ ফিরে পেতে হবে ...
মালিক কোনে ২é

pandas.datetimeবর্গ অনুমোদিত নয় এবং ভবিষ্যতে সংস্করণে পান্ডাস থেকে সরানো হবে। datetimeপরিবর্তে মডিউল থেকে আমদানি করুন।
ট্রেনটন ম্যাককিনে

82

নির্দিষ্ট শুরু এবং শেষ তারিখের মধ্যে তারিখের ব্যাপ্তি পান (সময় ও স্থানের জটিলতার জন্য অনুকূলিতকরণ):

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")

6
প্রাথমিক পরামর্শ হ'ল একটি ডেট_জেনেটর পেতে [] এর পরিবর্তে () ব্যবহার করুন। এই অর্থে দক্ষতার সাথে খেজুরের পুরো অ্যারে সংরক্ষণ করার প্রয়োজন হবে না এবং প্রয়োজন হলে কেবল একটি তৈরি করতে হবে।
সন্দীপ

2
নোট করুন শেষের তারিখ উত্পন্ন হয় না।
থরবজর্ন রাভন অ্যান্ডারসন

8
শেষের তারিখ পেতে (শেষ-শুরু + 1) ব্যবহার করুন।
সন্দীপ

6
ওপি-র প্রশ্নের উত্তর দেয় না, তবে এটিই আমি পরে ছিলাম :)
থিয়েরি জ।

2
(end-start+1)কাজ করে না, আপনি একটি টাইমডেল্টা এবং ইন্ট যোগ করতে পারবেন না। আপনি (end-start).days + 1যদিও ব্যবহার করতে পারেন ।
স্টিফেন পলগার

44

আপনি একটি জেনারেটর ফাংশন লিখতে পারেন যা আজ থেকে শুরু হওয়া তারিখের অবজেক্টগুলি ফিরিয়ে দেয়:

import datetime

def date_generator():
  from_date = datetime.datetime.today()
  while True:
    yield from_date
    from_date = from_date - datetime.timedelta(days=1)

এই জেনারেটর আজ থেকে শুরু হয়ে একবারে একদিন পিছনে যাওয়ার তারিখগুলি ফেরত দেয়। এখানে প্রথম 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)]

একটি লুপ বা তালিকা বোঝার উপর এই পদ্ধতির সুবিধা হ'ল আপনি যতবার চান ফিরে যেতে পারেন।

সম্পাদন করা

একটি ফাংশনের পরিবর্তে জেনারেটর এক্সপ্রেশন ব্যবহার করে আরও কমপ্যাক্ট সংস্করণ:

date_generator = (datetime.datetime.today() - datetime.timedelta(days=i) for i in itertools.count())

ব্যবহার:

>>> 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)]

1
জেনারেটরগুলি এটি করার আদর্শ উপায়, যদি দিনের সংখ্যা নির্বিচারে হয়।
xssChauhan

32

হ্যাঁ, চাকাটি পুনর্নবীকরণ করুন .... কেবল ফোরামটি অনুসন্ধান করুন এবং আপনি এরকম কিছু পাবেন:

from dateutil import rrule
from datetime import datetime

list(rrule.rrule(rrule.DAILY,count=100,dtstart=datetime.now()))

22
Labix.org/python-dateutil প্রয়োজন । দেখতে কেবল এক লাইনের সংরক্ষণের জন্য বাহ্যিক নির্ভরতার চেয়ে দুর্দান্ত তবে খুব কমই লাগছে।
বেনি চেরনিয়াভস্কি-পাসকিন

1
অন্য উত্তরগুলি খুব পাইথোনিক এমন কাউকে বিশ্বাস করা যায় না। Rrule একটি ভয়ঙ্কর নাম যদিও, এই এক অন্তত চোখের উপর সহজ।
নৌকোডার

7
@ বেনিচেরনিয়াভস্কি-পাসকিন: পিরিয়ড (ক্যালেন্ডার) গাণিতিক প্রয়োগের সময় সূক্ষ্ম বাগগুলি প্রবর্তন করা খুব সহজ। আইক্যাল্যান্ডার আরএফসিdateutil.rrule প্রয়োগ করে - প্রায় একই রকম কার্যকারিতার একাধিক বাস্তবায়নের পরিবর্তে একটি সু-সংজ্ঞায়িত আচরণের সাথে ফাংশনগুলি ব্যবহার করা আরও সহজ that বাগ ফিক্সিংকে একটি জায়গায় সীমাবদ্ধ করার অনুমতি দেয়। dateutil.rrule
jfs

3
@ মার্ক0978: rruleনাম নির্বিচারে নয়; এটি সম্পর্কিত rfc
jfs

1
হ্যাঁ, আমি দুর্ভাগ্যজনক নামেরগুলির জন্য ডেটুথিলিকে দোষ দিচ্ছিলাম না :-)
বোটকোডার

32

আপনি এটিকে আরও সহজ করার জন্য ডে অর্ডিনালটি ব্যবহার করতে পারেন:

def date_range(start_date, end_date):
    for ordinal in range(start_date.toordinal(), end_date.toordinal()):
        yield datetime.date.fromordinal(ordinal)

বা মন্তব্যে প্রস্তাবিত হিসাবে আপনি এই জাতীয় একটি তালিকা তৈরি করতে পারেন:

date_range = [
    datetime.date.fromordinal(ordinal) 
    for ordinal in range(
        start_date.toordinal(),
        end_date.toordinal(),
    )
]

18

এই প্রশ্নের শিরোনাম থেকে আমি এমন কিছু সন্ধানের প্রত্যাশা করছিলাম যা 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))]

সমস্ত ক্রেডিট এই উত্তরের !


1
এটি প্রশ্নের উত্তরগুলির অনেকের চেয়ে অনেক বেশি এক লাইন নয়।
টমাস ব্রাউন

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

11

এখানে S.Lott এর উত্তর যে দুইটি তারিখের মধ্যে তারিখ একটি তালিকা দেয় বন্ধ বিল্ডিং একটি কিছুটা ভিন্ন উত্তর startএবং end। নীচের উদাহরণে, ২০১ of সালের শুরু থেকে আজ অবধি।

start = datetime.datetime(2017,1,1)
end = datetime.datetime.today()
daterange = [start + datetime.timedelta(days=x) for x in range(0, (end-start).days)]

7

দেরি উত্তরটি আমি জানি, তবে আমার ঠিক একই সমস্যা ছিল এবং সিদ্ধান্ত নিয়েছিলাম যে পাইথনের অভ্যন্তরীণ পরিসীমা ফাংশনটি এই ক্ষেত্রে কিছুটা কম ছিল তাই আমি এটি আমার ব্যবহারের মডিউলে ওভাররাইড করেছি।

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))

1
আমি মনে করি আপনি চান output = []এবং while cmp(...)লুপ লুপ পরিবর্তন করতে। তুলনা range(0,10,1)এবং _range(0,10,1)
sigfpe

3
আমি মনে করি আপনি এই ফাংশনটির নাম দিলে এই উত্তরটি আরও ভাল হবে date_range
ব্র্যান্ডন ব্র্যাডলি

7

উত্তরের উপর ভিত্তি করে আমি নিজের জন্য এটি লিখেছিলাম:

import datetime;
print [(datetime.date.today() - datetime.timedelta(days=x)).strftime('%Y-%m-%d') for x in range(-5, 0)]

আউটপুট:

['2017-12-11', '2017-12-10', '2017-12-09', '2017-12-08', '2017-12-07']

পার্থক্যটি হ'ল আমি ' date' 'বস্তুটি পাই,' 'নয় datetime.datetime


7

যদি দুটি তারিখ থাকে এবং আপনার পরিসীমা চেষ্টা করতে হবে

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)))

5

এখানে আমার তৈরি কোডটি আমার নিজের কোড থেকে প্রকাশিত হয়েছে this (আমি জানি প্রশ্নটি খুব পুরানো, তবে অন্যরা এটি ব্যবহার করতে পারে)

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

4

সাপ্তাহিক দিনের তালিকা পেতে বাশ স্ক্রিপ্টগুলির জন্য এখানে একটি লাইনার রয়েছে, এটি অজগর 3 3. যা-ই সহজেই সংশোধন করা হয়েছে, শেষের ইনটটি অতীতে থাকা দিনের সংখ্যা want

python -c "import sys,datetime; print('\n'.join([(datetime.datetime.today() - datetime.timedelta(days=x)).strftime(\"%Y/%m/%d\") for x in range(0,int(sys.argv[1])) if (datetime.datetime.today() - datetime.timedelta(days=x)).isoweekday()<6]))" 10

একটি সূচনা (বা বরং, শেষ) তারিখ সরবরাহ করার জন্য এখানে একটি বৈকল্পিক

python -c "import sys,datetime; print('\n'.join([(datetime.datetime.strptime(sys.argv[1],\"%Y/%m/%d\") - datetime.timedelta(days=x)).strftime(\"%Y/%m/%d \") for x in range(0,int(sys.argv[2])) if (datetime.datetime.today() - datetime.timedelta(days=x)).isoweekday()<6]))" 2015/12/30 10

এখানে নির্বিচারে শুরু এবং শেষ তারিখগুলির জন্য একটি বৈকল্পিক। এটি মারাত্মকভাবে দক্ষ নয়, তবে এটি ব্যাশ স্ক্রিপ্টে লুপের জন্য রাখার জন্য ভাল:

python -c "import sys,datetime; print('\n'.join([(datetime.datetime.strptime(sys.argv[1],\"%Y/%m/%d\") + datetime.timedelta(days=x)).strftime(\"%Y/%m/%d\") for x in range(0,int((datetime.datetime.strptime(sys.argv[2], \"%Y/%m/%d\") - datetime.datetime.strptime(sys.argv[1], \"%Y/%m/%d\")).days)) if (datetime.datetime.strptime(sys.argv[1], \"%Y/%m/%d\") + datetime.timedelta(days=x)).isoweekday()<6]))" 2015/12/15 2015/12/30

আপনার মন্তব্যে কোড সহ আপনার উত্তর পোস্টটি আপডেট করতে পারে। পাইথন মন্তব্যে জড়িয়ে পড়ে এবং কিন্ডা ফর্ম্যাটিংয়ের প্রয়োজন।
জ্যাক বাথম্যান

3

ম্যাটপ্ল্লোব সম্পর্কিত

from matplotlib.dates import drange
import datetime

base = datetime.date.today()
end  = base + datetime.timedelta(days=100)
delta = datetime.timedelta(days=1)
l = drange(base, end, delta)

3

আমি জানি এটির উত্তর দেওয়া হয়েছে, তবে আমি আমার উত্তরটি historicalতিহাসিক উদ্দেশ্যে রেখে দেব এবং যেহেতু আমি মনে করি এটি সরাসরি এগিয়ে আছে is

import numpy as np
import datetime as dt
listOfDates=[date for date in np.arange(firstDate,lastDate,dt.timedelta(days=x))]

অবশ্যই এটি কোড-গল্ফের মতো কিছু জিততে পারে না, তবে আমি মনে করি এটি মার্জিত is


arangeপদক্ষেপ সঙ্গে বেশ চমৎকার, কিন্তু listOfDatesনিয়ে গঠিত numpy datetime64 পাইথন নেটিভ datetimes পরিবর্তে।
এফ.রাব

2
তবে আপনি অদ্ভুত ডেটটাইম 64 এর পরিবর্তে দেশীয় অজগরটি ডেটটাইম করতে ব্যবহার np.arange(…).astype(dt.datetime)করতে arangeপারেন।
এফ.আরব

2

সন্দীপের উত্তর থেকে শুরু করে সামনের দিকে বা পিছনে গণনা করা অন্য একটি উদাহরণ।

from datetime import date, datetime, timedelta
from typing import Sequence
def range_of_dates(start_of_range: date, end_of_range: date) -> Sequence[date]:

    if start_of_range <= end_of_range:
        return [
            start_of_range + timedelta(days=x)
            for x in range(0, (end_of_range - start_of_range).days + 1)
        ]
    return [
        start_of_range - timedelta(days=x)
        for x in range(0, (start_of_range - end_of_range).days + 1)
    ]

start_of_range = datetime.today().date()
end_of_range = start_of_range + timedelta(days=3)
date_range = range_of_dates(start_of_range, end_of_range)
print(date_range)

দেয়

[datetime.date(2019, 12, 20), datetime.date(2019, 12, 21), datetime.date(2019, 12, 22), datetime.date(2019, 12, 23)]

এবং

start_of_range = datetime.today().date()
end_of_range = start_of_range - timedelta(days=3)
date_range = range_of_dates(start_of_range, end_of_range)
print(date_range)

দেয়

[datetime.date(2019, 12, 20), datetime.date(2019, 12, 19), datetime.date(2019, 12, 18), datetime.date(2019, 12, 17)]

মনে রাখবেন যে শুরুর তারিখটি রিটার্নে অন্তর্ভুক্ত রয়েছে, সুতরাং আপনি যদি মোট চারটি তারিখ চান তবে ব্যবহার করুন timedelta(days=3)


1
from datetime import datetime, timedelta
from dateutil import parser
def getDateRange(begin, end):
    """  """
    beginDate = parser.parse(begin)
    endDate =  parser.parse(end)
    delta = endDate-beginDate
    numdays = delta.days + 1
    dayList = [datetime.strftime(beginDate + timedelta(days=x), '%Y%m%d') for x in range(0, numdays)]
    return dayList

1

datetimeএবং এর সাথে একটি মাসিক তারিখের পরিসীমা জেনারেটর dateutil। সহজ এবং বুঝতে সহজ:

import datetime as dt
from dateutil.relativedelta import relativedelta

def month_range(start_date, n_months):
        for m in range(n_months):
            yield start_date + relativedelta(months=+m)

0
import datetime    
def date_generator():
    cur = base = datetime.date.today()
    end  = base + datetime.timedelta(days=100)
    delta = datetime.timedelta(days=1)
    while(end>base):
        base = base+delta
        print base

date_generator()

1
তিনি ফিরে যেতে চেয়েছিলেন, এগিয়ে নয় .. তাই হওয়া endউচিত base - datetime.timedelta। তবুও ... কেন এই সমাধানটি আসলটির চেয়ে ভাল?
ফ্রেগ্রি 8787

0

উপরের উত্তরগুলি থেকে তারিখ জেনারেটরের জন্য আমি এই উদাহরণটি তৈরি করেছি

import datetime
date = datetime.datetime.now()
time = date.time()
def date_generator(date, delta):
  counter =0
  date = date - datetime.timedelta(days=delta)
  while counter <= delta:
    yield date
    date = date + datetime.timedelta(days=1)
    counter +=1

for date in date_generator(date, 30):
   if date.date() != datetime.datetime.now().date():
     start_date = datetime.datetime.combine(date, datetime.time())
     end_date = datetime.datetime.combine(date, datetime.time.max)
   else:
     start_date = datetime.datetime.combine(date, datetime.time())
     end_date = datetime.datetime.combine(date, time)
   print('start_date---->',start_date,'end_date---->',end_date)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.