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


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.