সপ্তাহের নম্বর থেকে তারিখ পান


91

দয়া করে আমার কোডে কি সমস্যা হয়েছে:

import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)

"2013-01-01 00:00:00" প্রদর্শন করুন, ধন্যবাদ।

উত্তর:


182

একটি তারিখ উত্পন্ন করতে একটি সপ্তাহের সংখ্যা যথেষ্ট নয়; আপনার পাশাপাশি সপ্তাহের একটি দিন দরকার। একটি ডিফল্ট যুক্ত করুন:

import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d + '-1', "%Y-W%W-%w")
print(r)

-1এবং -%wপ্যাটার্ন পার্সার সেই সপ্তাহের সোমবার বাছাই বলে। এই ফলাফলগুলি:

2013-07-01 00:00:00

%Wসোমবার সপ্তাহের প্রথম দিন হিসাবে ব্যবহার করে। আপনি নিজের সপ্তাহের দিন বাছাই করতে গিয়ে, আপনি যদি তা থেকে সরে যান তবে আপনি অপ্রত্যাশিত ফলাফল পেতে পারেন।

ডকুমেন্টেশনে strftime()ও strptime()আচরণ বিভাগটি দেখুন , পাদটীকা 4:

যখন সঙ্গে ব্যবহার strptime()পদ্ধতি, %Uএবং %Wযখন সপ্তাহে এবং বছরের দিন নির্দিষ্ট আছে শুধুমাত্র গণনার ব্যবহৃত হয়।

দ্রষ্টব্য, যদি আপনার সপ্তাহের নম্বরটি আইএসও সপ্তাহের তারিখ হয় তবে আপনি %G-W%V-%uপরিবর্তে এটি ব্যবহার করতে চাইবেন ! এই নির্দেশগুলির জন্য পাইথন 3.6 বা আরও নতুন প্রয়োজন।


4
কাজ করে না. ডেটটাইম.ডেটটাইম.স্ট্রিপটাইম ("2018-W0-0", "% YW% W-% w") == ডেটটাইম.ডেটটাইম.স্ট্রিপটাইম ("2018-ডাব্লু 1-0", "% ওয়াইডব্লু% ডব্লু% ডাব্লু") -> "2018-01-07 00:00:00"। 2018 এর প্রথম এবং দ্বিতীয় সপ্তাহের একই সূচনা তারিখ রয়েছে।
— ozw1z5rd

4
@ ozw1z5rd: এ কারণেই 2018 এ 0 সপ্তাহ নেই is সপ্তাহ 0 বছরের প্রথম সোমবারের আগে আংশিক সপ্তাহ; 2018 এ প্রথম সোমবার 1 শে জানুয়ারী। অন্য কথায়, আপনার ইনপুট স্ট্রিংটি এখানে সমস্যা, কৌশল নয় এবং পাইথন ডাব্লু0 এর পরিবর্তে ডাব্লু 1 বোঝাতে ত্রুটি-সংশোধন করেছেন।
— মার্টিজন পিটারস

@ ozw1z5rd: এটি আপনার অ্যাপ্লিকেশনটির জন্য যদি একটি সমস্যা হয় তবে আপনাকে এই বছরগুলিতে বিশেষ ক্ষেত্রে করা দরকার; if d.endswith('-W0') and r.day == 7: raise ValueError('Invalid date string, No week 0 in {}'.format(r.year))
— মার্টিজন পিটারস

কোন ধারণা কীভাবে নন শূন্য প্যাডড সপ্তাহের সংখ্যাগুলি নিয়ে কাজ করবেন? (যেমন 2020-w1, 2020-w52)
— মাইকেল এইচ।

@ মিশেলএইচ .: আপনি কী জিজ্ঞাসা করছেন তা আমি নিশ্চিত নই।
— মার্টিজন পিটারস

30

অন্যান্য উত্তরগুলি সম্পূর্ণ করতে - আপনি যদি আইএসও সপ্তাহের নম্বরগুলি ব্যবহার করেন তবে এই স্ট্রিংটি যথাযথ (প্রদত্ত আইএসও সপ্তাহের সংখ্যার সোমবার পেতে):

import datetime
d = '2013-W26'
r = datetime.datetime.strptime(d + '-1', '%G-W%V-%u')
print(r)

%G, %V, %uএর আইএসও সমতুল হয় %Y, %W, %w, তাই এই আউটপুট:

2013-06-24 00:00:00

পাইথনে অ্যাভাইলাবে ৩.6++; থেকে ডক্স ।


14

পাইথন ৩.৮-তে সুবিধাজনক রয়েছে datetime.date.fromisocalendar:

>>> from datetime import date
>>> date.fromisocalendar(2020, 1, 1)  # (year, week, day of week)
datetime.date(2019, 12, 30, 0, 0)

পুরানো পাইথন সংস্করণগুলিতে (3.7-) গণনাটি datetime.date.isocalendarসপ্তাহের ISO8601 অনুবর্তী সপ্তাহ নির্ধারণের জন্য তথ্যটি ব্যবহার করতে পারে :

from datetime import date, timedelta

def monday_of_calenderweek(year, week):
    first = date(year, 1, 1)
    base = 1 if first.isocalendar()[1] == 1 else 8
    return first + timedelta(days=base - first.isocalendar()[2] + 7 * (week - 1))

উভয় সঙ্গে কাজ করে datetime.datetime।


7
import datetime
res = datetime.datetime.strptime("2018 W30 w1", "%Y %W w%w")
print res

সপ্তাহের দিন হিসাবে 1 যুক্ত করা হ'ল বর্তমান সপ্তাহের শুরুটি উত্পন্ন করবে। টাইমডেল্টা (দিনগুলি = 6) যোগ করা আপনাকে সপ্তাহের সমাপ্তি দেয়।

datetime.datetime(2018, 7, 23)

@ সেন্তিকুমার সি যে নীচের মত হওয়া উচিতres = datetime.datetime.strptime("2018 W30 w1", "%Y W%W w%w")
— এমডি আলাউদ্দিন আল-আমিন

গৃহীত উত্তরের 2021-01-04 তারিখ নিয়ে সমস্যা আছে, এটি বলছে এটি 2020 সাল সম্পর্কিত
— ইগ্যাসিও.মুনিজাগ

1

যদি আপনার বার্ষিক বার্ষিক সংখ্যা থাকে তবে বছরের প্রথম দিনটিতে কেবল সপ্তাহের সংখ্যা যুক্ত করুন।

>>> import datetime
>>> from dateutil.relativedelta import relativedelta

>>> week = 40
>>> year = 2019
>>> date = datetime.date(year,1,1)+relativedelta(weeks=+week)
>>> date
datetime.date(2019, 10, 8)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.