পাইথনে বছরের / মাস / দিনকে বছরের রূপান্তর করুন


127

আমি পাইথন ডেটটাইম মডিউল ব্যবহার করছি , অর্থাত:

>>> import datetime
>>> today = datetime.datetime.now()
>>> print today
2009-03-06 13:24:58.857946

এবং আমি বছরের যে দিনটি লিপ বছরের সংবেদনশীল তা গণনা করতে চাই। যেমন আজ (March মার্চ, ২০০৯) হল ২০০৯ সালের th৫ তম দিন Here এখানে ওয়েব-ভিত্তিক ডেটটাইম ক্যালকুলেটর

যাইহোক, আমি দুটি বিকল্প দেখতে পাচ্ছি:

উ: একটি সংখ্যা তৈরি করুন_আর দিন_আর_মনি অ্যারে = [৩১, ২৮, ...], সিদ্ধান্ত নিন এটি কোনও লিপ বছর কিনা, ম্যানুয়ালি দিনগুলি যোগ করুন।

খ। datetime.timedeltaঅনুমান করতে ব্যবহার করুন এবং তারপরে বছরের সঠিক দিনের জন্য বাইনারি অনুসন্ধান করুন:

>>> import datetime
>>> YEAR = 2009
>>> DAY_OF_YEAR = 62
>>> d = datetime.date(YEAR, 1, 1) + datetime.timedelta(DAY_OF_YEAR - 1)

এই দু'জনেই বেশ চমকপ্রদ বোধ করে এবং আমার মনে হয় যে বছরের বছরের হিসাব করার আরও একটি "পাইথোনিক" উপায় রয়েছে। কোন ধারণা / পরামর্শ?

উত্তর:


255

খুব সহজ সমাধান রয়েছে:

from datetime import datetime
day_of_year = datetime.now().timetuple().tm_yday

13
একটি খুব ছোটখাট এবং তর্কযুক্ত date.today()তাত্পর্যপূর্ণ পেডেন্টিক সংযোজন, তবে এটির পরিবর্তে ব্যবহার datetime.now()করাও কাজ করে এবং অপারেশনটির প্রকৃতিটিকে আরও কিছুটা জোর দেয়।
জেরেমি

5
আরও ভাল: time.localtime().tm_yday স্থানীয় সময় () যা দেয় তার ফলস্বরূপ একটি ডেটটাইমকে একটি টাইমআপে রূপান্তর করার দরকার নেই।
মাইক এলিস

14
@ মাইকেলিস কিন্তু এই সমাধানটি ডেটটাইম আজকের সাথে মিল না রাখলে কী করতে হবে তা চিত্রিত করে।
জারিত

2
দ্রষ্টব্য: এটি গণনা শুরু 1
মেহেদী নেলেন

1
আমি যদি বিপরীতটি করতে চাই, তবে আমার কাছে সংখ্যাটি "2020 সালের 26 তম দিন" বলতে দেয় এবং আমি এটি একটি "26-01-2020" রূপান্তরিত করতে চাই?
শঙ্কর

43

আপনি ব্যবহার করতে পারবেন না strftime?

>>> import datetime
>>> today = datetime.datetime.now()
>>> print today
2009-03-06 15:37:02.484000
>>> today.strftime('%j')
'065'

সম্পাদন করা

মন্তব্যে উল্লিখিত হিসাবে, আপনি যদি এই সংখ্যার সাথে তুলনা বা গণনা করতে চান তবে আপনাকে এটিকে রূপান্তর করতে হবে int()কারণ strftime()একটি স্ট্রিং ফিরে আসে। যদি এটি হয় তবে আপনি ডিজনেক্সের উত্তরটি ব্যবহার করা থেকে ভাল ।


1
-1: আইকি। "আজ মাইনাস জানুয়ারী 1 ম" অ্যালগরিদম আরও ভাল। আরআরএফটাইমের '% জে' সম্পর্কে ট্রাইভিয়ার কোনও অংশ না দেখে অনেক ক্লিনার এবং পুরোপুরি স্পষ্ট।
এস.লট

12
সিরিয়াসলি? এই আকি এবং সাবস্ট্রাক্টিং জানুয়ারি 1 ম কীভাবে হয় না? স্ট্রফটাইম একটি কারণ আছে। আমি শুধু একমত না। এটি আমার মতে ওয়ে ওয়ে ক্লিনার।
পাওলো বার্গান্টিনো

1
স্ট্রাইফটাইম ব্যবহার অপ্রত্যক্ষ উত্স পড়ুন। উত্পাদিত স্ট্রিংটি কোনও গণনা / তুলনার আগে একটি সংখ্যায় রূপান্তর করা উচিত, তবে কেন বিরক্ত করবেন?
tzot

2
স্ট্রিংয়ের ক্ষেত্রে যদি বছরের একটি দিনের প্রয়োজন হয় তবে ফাইলের নামে ব্যবহারের জন্য বলুন, স্ট্রফটাইম অনেক ক্লিনার সমাধান হিসাবে।
অধিনায়ক_এম

13

ডিজেইএনএক্সের উত্তরটি প্রশ্নের দুর্দান্ত উত্তর। বিপরীত ফাংশন সন্ধান করার সময় আমি এই প্রশ্নটি পেয়েছি। আমি এটি কাজ করতে পেলাম:

import datetime
datetime.datetime.strptime('1936-077T13:14:15','%Y-%jT%H:%M:%S')

>>>> datetime.datetime(1936, 3, 17, 13, 14, 15)

datetime.datetime.strptime('1936-077T13:14:15','%Y-%jT%H:%M:%S').timetuple().tm_yday

>>>> 77

আমি আশেপাশে শিষ্টাচার সম্পর্কে নিশ্চিত নই, তবে আমি ভেবেছিলাম যে বিপরীত ক্রিয়াকলাপের একটি পয়েন্টার আমার মতো অন্যদের জন্য দরকারী।


6

পাইথন ৩.৪, লিনাক্স এক্স 64৪ এ আমি বিভিন্ন পদ্ধতির পারফরম্যান্স উপস্থাপন করতে চাই। লাইন প্রোফাইলার থেকে অংশ:

      Line #      Hits         Time  Per Hit   % Time  Line Contents
      ==============================================================
         (...)
         823      1508        11334      7.5     41.6          yday = int(period_end.strftime('%j'))
         824      1508         2492      1.7      9.1          yday = period_end.toordinal() - date(period_end.year, 1, 1).toordinal() + 1
         825      1508         1852      1.2      6.8          yday = (period_end - date(period_end.year, 1, 1)).days + 1
         826      1508         5078      3.4     18.6          yday = period_end.timetuple().tm_yday
         (...)

তাই সবচেয়ে দক্ষ হয়

yday = (period_end - date(period_end.year, 1, 1)).days

1
আপনি পারফরম্যান্সটি কীভাবে গণনা করলেন? আমি টাইম.টাইম ব্যবহার করার চেষ্টা করেছি এবং সেগুলি হ'ল আমার ফলাফল: ডিফ এফ (): (আজ - তারিখটাইম.ডেটটাইম (আজ.ইয়ার, 1, 1)) দিন + 1 শুরু = সময়.টাইম (); চ (); মুদ্রণ ('ল্যাপসড {}'। ফর্ম্যাট (সময়.টাইম () - শুরু)); ল্যাপড 5.221366882324219e-05 ডিফ এফ (): ইনট (আজ.স্ট্রফটাইম ('% জে')); সূচনা = সময়.টাইম (); চ (); মুদ্রণ ('ল্যাপসড {}'। ফর্ম্যাট (সময়.টাইম () - শুরু)); 7.462501525878906e-05
ssoto

5

তারিখ থেকে সবেমাত্র জানুয়ারী 1 বিয়োগ করুন:

import datetime
today = datetime.datetime.now()
day_of_year = (today - datetime.datetime(today.year, 1, 1)).days + 1

1
পাওলো এর বিপরীতে কিছুই নয়, তবে ডেটটাইম.টিমেডেল্টা দিনগুলিতে (পাশাপাশি অবশ্যই সেকেন্ড এবং মাইক্রোসেকেন্ডস) হিসাবে চিহ্নিত করা হয়, সুতরাং এটি একটি প্রাকৃতিক পছন্দ --- স্ট্রিং ফর্ম্যাটিংয়ের চেয়ে অবশ্যই আরও সরাসরি
zweiterlinde 2

1
d.toordinal () - তারিখ (d.year, 1, 1)। টর্ডিনাল () + 1 ডকুমেন্টেশন অনুসারে আরও মানক। পুরো সময়ের টিপল উত্পাদন না করে এটি গৃহীত উত্তরের সমতুল্য।
ডিংল

5

আপনার যদি datetimeমডিউলটির ব্যবহার এড়াতে কারণ থাকে তবে এই ফাংশনগুলি কাজ করবে।

def is_leap_year(year):
    """ if year is a leap year return True
        else return False """
    if year % 100 == 0:
        return year % 400 == 0
    return year % 4 == 0

def doy(Y,M,D):
    """ given year, month, day return day of year
        Astronomical Algorithms, Jean Meeus, 2d ed, 1998, chap 7 """
    if is_leap_year(Y):
        K = 1
    else:
        K = 2
    N = int((275 * M) / 9.0) - K * int((M + 9) / 12.0) + D - 30
    return N

def ymd(Y,N):
    """ given year = Y and day of year = N, return year, month, day
        Astronomical Algorithms, Jean Meeus, 2d ed, 1998, chap 7 """    
    if is_leap_year(Y):
        K = 1
    else:
        K = 2
    M = int((9 * (K + N)) / 275.0 + 0.98)
    if N < 32:
        M = 1
    D = N - int((275 * M) / 9.0) + K * int((M + 9) / 12.0) + 30
    return Y, M, D

1

এই কোডটি একটি ইনপুট আর্গুমেন্ট হিসাবে একটি তারিখ নেয় এবং বছরের দিনটি ফেরত দেয়।

from datetime import datetime
date = raw_input("Enter date: ")  ## format is 02-02-2016
adate = datetime.datetime.strptime(date,"%d-%m-%Y")
day_of_year = adate.timetuple().tm_yday
day_of_year
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.