অজগর থেকে জন্ম তারিখ থেকে বয়স


159

আজকের তারিখ এবং একজন ব্যক্তির জন্ম তারিখ থেকে আমি কীভাবে অজগরটিতে একটি বয়স খুঁজে পেতে পারি? জন্ম তারিখটি জ্যাঙ্গো মডেলের একটি ডেটফিল্ডের একটি।


4
যখন স্ট্যান্ডার্ড datetimeমডিউলটি পর্যাপ্ত নয়, আপনি চেষ্টা করতে পারেন: Labix.org/python-dateutil
Tomasz

1
এটি প্রায় অবশ্যই সমাধান করেছেন:dateutil.relativedelta.relativedelta
উইলিয়ামস

উত্তর:


288

এটি খুব সহজ করে বিবেচনা করা যেতে পারে যে int (সত্য) 1 এবং int (মিথ্যা) 0:

from datetime import date

def calculate_age(born):
    today = date.today()
    return today.year - born.year - ((today.month, today.day) < (born.month, born.day))

4
একটি নিটপিক: date.today()জন্মের স্থান থেকে আলাদা হতে পারে এমন স্থানীয় সময় অঞ্চলটিতে তারিখটি দেয়। আপনার স্পষ্টভাবে
টাইমজোনগুলি

10
এটি সম্ভবত আপনার "বয়স" সংজ্ঞা উপর নির্ভর করে। সমস্ত ব্যবহারিক উদ্দেশ্যে একটি জন্মদিন সাধারণত তারিখ হিসাবে দেওয়া হয়, টাইমজোন-সচেতন তারিখের সময় নয় (অর্থাত "জন্মগত" বিবরণটি অনুপস্থিত)। বেশিরভাগ লোক মধ্যরাতে তীক্ষ্ণ জন্মগ্রহণ করেন না (তাই সাধারণত অকাল :-) পর্যবেক্ষণ করুন), এবং যখন অন্য কোনও টাইমজোন হয়, তখন আমি ধরে নেব যে বেশিরভাগ লোকেরা তাদের জন্মদিন স্থানীয় সময়ে পালন করেন (এটি আমিই করি, আমি 10-12 ঘন্টা এগিয়ে থাকি) আমার জন্ম স্থানের সময়)। যদি "জন্মগত" সময়সীকরণ সচেতন তারিখের সময় হয়, আপনি পাইটজ এর পাটিগণিত ব্যবহার করতে পারেন এবং ()) স্বাভাবিক করতে পারতেন - সম্ভবত কোনও জ্যোতিষ সফ্টওয়্যারটির আগ্রহ?
ড্যানি ডব্লিউ অ্যাডায়ার

2
আমি মানবযুগের প্রসঙ্গে সম্পূর্ণ সম্মত তবে আপনার সূত্রটি আরও বিস্তৃত প্রসঙ্গে ব্যবহার করা যেতে পারে। যদিও পারিবারিক traditionতিহ্য এবং প্রোগ্রামার হওয়ার কারণে আমি ব্যক্তিগতভাবে আমার জন্মদিন এক ঘন্টা আগেও উদযাপন করি না কেন যেখানেই থাকি না কেন সময় গণনা করা তুচ্ছ।
jfs

@ পিডিডি: জন্ম তারিখ / তারিখের সময়
kjagiello

68
from datetime import date

def calculate_age(born):
    today = date.today()
    try: 
        birthday = born.replace(year=today.year)
    except ValueError: # raised when birth date is February 29 and the current year is not a leap year
        birthday = born.replace(year=today.year, month=born.month+1, day=1)
    if birthday > today:
        return today.year - born.year - 1
    else:
        return today.year - born.year

আপডেট: ড্যানির সমাধানটি ব্যবহার করুন , এটি আরও ভাল


2
যেমন নীতি হিসাবে, আপনার exceptব্লকটি কেবলমাত্র একটি নির্দিষ্ট ব্যতিক্রম উত্থাপিত হতে পারে।
দেনিথ

1
@ ডেইনথ: শুভ কল ... আমার মনে হয় এটি একটি ValueError। আপডেট করা হয়েছে।
এমপেন

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

+ ব্যতিক্রম ছাড়া তবে, আমার কোনও সমস্যা আছে ? আমি মনে করি এটি বেশ সহজ। def calculate_age(dob)
গ্রিজেশ চৌহান

1
@ গ্রিজেশচৌহান: হ্যাঁ, আপনার কাজ হয় না। datetime.date(2014, 1, 1)দেয় -1, এটা 0. দিতে হবে তোমার today > dobযদি DOB না এই একই বছর আগে অতীতের চেক করা হয়। datetime.date.today()বছরের তথ্য অন্তর্ভুক্ত করে, তাই আমি আমার সমাধানে এটি বর্তমান বছরের সাথে প্রতিস্থাপন করি।
এমপেন

18
from datetime import date

days_in_year = 365.2425    
age = int((date.today() - birth_date).days / days_in_year)

পাইথন 3 এ আপনি এখানে বিভাগ সম্পাদন করতে পারেন datetime.timedelta:

from datetime import date, timedelta

age = (date.today() - birth_date) // timedelta(days=365.2425)

2
প্রতি চতুর্থ বছর এভি একশত বছর বাদে একটি লিপ বছর হয় প্রতি চারশত বছর বাদে লিপ বছর নয়। দিনগুলি চেষ্টা করুন_ইন = 365.2425
ড্যান

3
@ ড্যান: জুলিয়ান ( 365.25) এবং গ্রেগরিয়ান ক্যালেন্ডার বছরের ( 365.2425) পার্থক্যটি যদি আপনি ১৩০ বছরেরও কম বাঁচেন তবে এক দিনেরও কম।
jfs

4
এটি কিছু তারিখের জন্য কাজ করে না : (date(2017, 3, 1) - date(2004, 3, 1)) / timedelta(days=365.2425)ফিরে আসা উচিত 13, তবে এটি ফিরে আসে 12। উদাসীন, ফলাফল 12.999582469181433
href_

13

@ [টমাসজ জিলিনস্কি ] এবং @ উইলিয়ামস পাইথন-ডেটুটিলের পরামর্শ অনুসারে এটি মাত্র 5 লাইন করতে পারে।

from dateutil.relativedelta import *
from datetime import date
today = date.today()
dob = date(1982, 7, 5)
age = relativedelta(today, dob)

>>relativedelta(years=+33, months=+11, days=+16)`

10

সহজ উপায় ব্যবহার করা হয় python-dateutil

import datetime

import dateutil

def birthday(date):
    # Get the current date
    now = datetime.datetime.utcnow()
    now = now.date()

    # Get the difference between the current date and the birthday
    age = dateutil.relativedelta.relativedelta(now, date)
    age = age.years

    return age

7
জন্মদিন ২৯ শে ফেব্রুয়ারি হলে এবং আজকের তারিখ ২৮ ফেব্রুয়ারি সঠিকভাবে কাজ করে না (এটি আজকের ২৯ শে ফেব্রুয়ারীর মতো কাজ করবে)।
ট্রে হুনার

6
from datetime import date

def age(birth_date):
    today = date.today()
    y = today.year - birth_date.year
    if today.month < birth_date.month or today.month == birth_date.month and today.day < birth_date.day:
        y -= 1
    return y

তারিখের উদাহরণ বা এর মতো কিছু আপত্তি, ডকস.পিথথন.আর / 3 / লাইব্রেরি / ডেটটাইম.html#datetime.date, টাইপো স্থির।
গিজেরন

5

দুর্ভাগ্যক্রমে, আপনি কেবল টাইমডেল্টাকে সবচেয়ে বড় ইউনিট হিসাবে ব্যবহার করতে পারবেন না এটি দিন এবং লিপ বছরগুলি আপনাকে গণনা অবৈধ উপস্থাপন করবে। অতএব, চলুন যে বছরের সংখ্যাটি খুঁজে বের করি তারপরে গত বছরটি পূর্ণ না হলে একের সাথে সামঞ্জস্য করুন:

from datetime import date
birth_date = date(1980, 5, 26)
years = date.today().year - birth_date.year
if (datetime.now() - birth_date.replace(year=datetime.now().year)).days >= 0:
    age = years
else:
    age = years - 1

Upd:

এই সমাধানটি যখন ফেব্রুয়ারি, 29-এ কার্যকর হয় তখন ব্যতিক্রম ঘটায়। এখানে সঠিক চেক:

from datetime import date
birth_date = date(1980, 5, 26)
today = date.today()
years = today.year - birth_date.year
if all((x >= y) for x,y in zip(today.timetuple(), birth_date.timetuple()):
   age = years
else:
   age = years - 1

Upd2:

now()পারফরম্যান্স হিটকে একাধিক কল করা হাস্যকর, এটি সমস্ত ক্ষেত্রেই নয়, তবে অত্যন্ত বিশেষ ক্ষেত্রে গুরুত্বপূর্ণ। ভেরিয়েবল ব্যবহারের আসল কারণটি হ'ল ডেটা ইনসেসটেন্সি হওয়ার ঝুঁকি।


আপনাকে ধন্যবাদ, আমি কিছু পরীক্ষা করে এটি জানতে পেরেছি - এবং অ্যান্ডিডগের লিঙ্ক থেকে পাওয়া একটি অনুরূপ কোডটি শেষ করেছি।
tkalve

3
স্ট্রাইক 1: আপনি ডেটটাইম.ডেটের পরিবর্তে ডেটটাইম.ডেটটাইম ব্যবহার করছেন। স্ট্রাইক ২: আপনার কোডটি কুৎসিত এবং অদক্ষ। কলিং datetime.now () তিন বার ?? ধর্মঘট 3: জন্ম তারিখ 29 ফেব্রুয়ারী 2004 এবং আজকের তারিখ 28 ফেব্রুয়ারী 2010 6 বছর বয়সে ফিরে আসা উচিত, "ভ্যালুআরার: দিনটি মাসের বাইরে সীমার বাইরে" sh তুমি বাদ!
জন মাচিন

দুঃখিত, আপনার "আপডেট" কোডটি প্রথম প্রয়াসের চেয়েও বেশি বারোক এবং ভাঙ্গা - 29 ফেব্রুয়ারির কিছুই করার নেই; এটি ২০০৯-০6-১7 থেকে ২০১০-০ simple-০২ এর মতো অনেকগুলি সাধারণ ক্ষেত্রে ব্যর্থ হয় ... ব্যক্তি সম্ভবত 1 বছরের বেশি বয়সী তবে আপনি এক বছর বাদ দেন কারণ দিনগুলিতে পরীক্ষাটি ব্যর্থ হয় (2> = 15) f এবং সম্ভবত আপনি এটি পরীক্ষা করেন নি - এটিতে একটি সিনট্যাক্স ত্রুটি রয়েছে।
জন মাচিন

4

এই দৃশ্যের ক্লাসিক গোটচা হ'ল ফেব্রুয়ারির 29 তম দিনে জন্মগ্রহণকারী লোকদের সাথে কী করবেন। উদাহরণ: আপনার ভোটদান, গাড়ি চালানো, অ্যালকোহল কেনা ইত্যাদির জন্য আপনার বয়স ১৮ বছর হতে হবে ... আপনি যদি 2004-02-29-এ জন্মগ্রহণ করেন তবে আপনাকে প্রথম দিনটি কী করার অনুমতি দেওয়া হয়েছে: 2022-02 -28, বা 2022-03-01? আফ্রিএইচটি, বেশিরভাগই প্রথম, তবে কয়েকজন কিলজয়াই সম্ভবত দ্বিতীয়টি বলতে পারে।

এই দিনটিতে জন্মগ্রহণকারী জনগণের 0.068% (প্রায়) জনগণের জন্য কোড সরবরাহ করে:

def age_in_years(from_date, to_date, leap_day_anniversary_Feb28=True):
    age = to_date.year - from_date.year
    try:
        anniversary = from_date.replace(year=to_date.year)
    except ValueError:
        assert from_date.day == 29 and from_date.month == 2
        if leap_day_anniversary_Feb28:
            anniversary = datetime.date(to_date.year, 2, 28)
        else:
            anniversary = datetime.date(to_date.year, 3, 1)
    if to_date < anniversary:
        age -= 1
    return age

if __name__ == "__main__":
    import datetime

    tests = """

    2004  2 28 2010  2 27  5 1
    2004  2 28 2010  2 28  6 1
    2004  2 28 2010  3  1  6 1

    2004  2 29 2010  2 27  5 1
    2004  2 29 2010  2 28  6 1
    2004  2 29 2010  3  1  6 1

    2004  2 29 2012  2 27  7 1
    2004  2 29 2012  2 28  7 1
    2004  2 29 2012  2 29  8 1
    2004  2 29 2012  3  1  8 1

    2004  2 28 2010  2 27  5 0
    2004  2 28 2010  2 28  6 0
    2004  2 28 2010  3  1  6 0

    2004  2 29 2010  2 27  5 0
    2004  2 29 2010  2 28  5 0
    2004  2 29 2010  3  1  6 0

    2004  2 29 2012  2 27  7 0
    2004  2 29 2012  2 28  7 0
    2004  2 29 2012  2 29  8 0
    2004  2 29 2012  3  1  8 0

    """

    for line in tests.splitlines():
        nums = [int(x) for x in line.split()]
        if not nums:
            print
            continue
        datea = datetime.date(*nums[0:3])
        dateb = datetime.date(*nums[3:6])
        expected, anniv = nums[6:8]
        age = age_in_years(datea, dateb, anniv)
        print datea, dateb, anniv, age, expected, age == expected

এখানে ফলাফল:

2004-02-28 2010-02-27 1 5 5 True
2004-02-28 2010-02-28 1 6 6 True
2004-02-28 2010-03-01 1 6 6 True

2004-02-29 2010-02-27 1 5 5 True
2004-02-29 2010-02-28 1 6 6 True
2004-02-29 2010-03-01 1 6 6 True

2004-02-29 2012-02-27 1 7 7 True
2004-02-29 2012-02-28 1 7 7 True
2004-02-29 2012-02-29 1 8 8 True
2004-02-29 2012-03-01 1 8 8 True

2004-02-28 2010-02-27 0 5 5 True
2004-02-28 2010-02-28 0 6 6 True
2004-02-28 2010-03-01 0 6 6 True

2004-02-29 2010-02-27 0 5 5 True
2004-02-29 2010-02-28 0 5 5 True
2004-02-29 2010-03-01 0 6 6 True

2004-02-29 2012-02-27 0 7 7 True
2004-02-29 2012-02-28 0 7 7 True
2004-02-29 2012-02-29 0 8 8 True
2004-02-29 2012-03-01 0 8 8 True

এবং আমি সম্প্রতি শিখলাম দ্বিতীয় লিপ সম্পর্কে ।
বোবার্ট

3

আপনি যদি জ্যাঙ্গো টেমপ্লেটগুলি ব্যবহার করে কোনও পৃষ্ঠাতে এটি মুদ্রণ করতে চান তবে নিম্নলিখিতগুলি যথেষ্ট হতে পারে:

{{ birth_date|timesince }}

4
|timesinceবেশ কয়েক বছর ধরে টাইমডেল্টা গণনা করার জন্য জ্যাঙ্গো ব্যবহার করবেন না কারণ এটি লিপ বছরগুলিতে অ্যাকাউন্ট করে না এবং এইভাবে ভুল ফলাফল দেয়। আরও তথ্যের জন্য জাজানো টিকিট দেখুন # 19210।
জেএনএনএস

তা জানতাম না। ধন্যবাদ।
অ্যানয়েজ

2

কোনও ব্যক্তির বয়স বছর বা মাস বা দিন হিসাবে সন্ধানের সমাধান এখানে।

দেয় বলে জন্ম একজন ব্যক্তির তারিখ 2012-01-17T00: 00: 00 অতএব, তার বয়স 2013-01-16T00: 00: 00 হতে হবে 11 মাস

অথবা যদি তিনি জন্ম হয় 2012-12-17T00: 00: 00 , উপর তার বয়স 2013-01-12T00: 00: 00 হতে হবে 26 দিন

অথবা যদি তিনি জন্ম হয় 2000-02-29T00: 00: 00 , উপর তার বয়স 2012-02-29T00: 00: 00 হতে হবে 12 বছর

আপনার ডেটটাইম আমদানি করতে হবে ।

কোডটি এখানে:

def get_person_age(date_birth, date_today):

"""
At top level there are three possibilities : Age can be in days or months or years.
For age to be in years there are two cases: Year difference is one or Year difference is more than 1
For age to be in months there are two cases: Year difference is 0 or 1
For age to be in days there are 4 possibilities: Year difference is 1(20-dec-2012 - 2-jan-2013),
                                                 Year difference is 0, Months difference is 0 or 1
"""
years_diff = date_today.year - date_birth.year
months_diff = date_today.month - date_birth.month
days_diff = date_today.day - date_birth.day
age_in_days = (date_today - date_birth).days

age = years_diff
age_string = str(age) + " years"

# age can be in months or days.
if years_diff == 0:
    if months_diff == 0:
        age = age_in_days
        age_string = str(age) + " days"
    elif months_diff == 1:
        if days_diff < 0:
            age = age_in_days
            age_string = str(age) + " days"
        else:
            age = months_diff
            age_string = str(age) + " months"
    else:
        if days_diff < 0:
            age = months_diff - 1
        else:
            age = months_diff
        age_string = str(age) + " months"
# age can be in years, months or days.
elif years_diff == 1:
    if months_diff < 0:
        age = months_diff + 12
        age_string = str(age) + " months" 
        if age == 1:
            if days_diff < 0:
                age = age_in_days
                age_string = str(age) + " days" 
        elif days_diff < 0:
            age = age-1
            age_string = str(age) + " months"
    elif months_diff == 0:
        if days_diff < 0:
            age = 11
            age_string = str(age) + " months"
        else:
            age = 1
            age_string = str(age) + " years"
    else:
        age = 1
        age_string = str(age) + " years"
# The age is guaranteed to be in years.
else:
    if months_diff < 0:
        age = years_diff - 1
    elif months_diff == 0:
        if days_diff < 0:
            age = years_diff - 1
        else:
            age = years_diff
    else:
        age = years_diff
    age_string = str(age) + " years"

if age == 1:
    age_string = age_string.replace("years", "year").replace("months", "month").replace("days", "day")

return age_string

উপরের কোডগুলিতে ব্যবহৃত কিছু অতিরিক্ত ফাংশনগুলি হ'ল:

def get_todays_date():
    """
    This function returns todays date in proper date object format
    """
    return datetime.now()

এবং

def get_date_format(str_date):
"""
This function converts string into date type object
"""
str_date = str_date.split("T")[0]
return datetime.strptime(str_date, "%Y-%m-%d")

এখন, আমাদের 2000-02-29T00: 00: 00 এর মত স্ট্রিং সহ get_date_format () খাওয়াতে হবে

এটি এটিকে তারিখ টাইপ অবজেক্টে রূপান্তর করবে যা get_Press_age (তারিখ_জন্ম, তারিখ_ আজ) খাওয়ানো হয় ।

Get_Press_age (তারিখ_জন্ম, তারিখ_ আজ) ফাংশনটি স্ট্রিং ফর্ম্যাটে বয়স ফিরে আসবে।


2

ড্যানির সলিউশনটি প্রসারিত করা , তবে তরুণ লোকদের বয়সের জন্য বিভিন্ন ধরণের প্রতিবেদন করার পদ্ধতি সহ (নোট, আজ হ'ল datetime.date(2015,7,17)):

def calculate_age(born):
    '''
        Converts a date of birth (dob) datetime object to years, always rounding down.
        When the age is 80 years or more, just report that the age is 80 years or more.
        When the age is less than 12 years, rounds down to the nearest half year.
        When the age is less than 2 years, reports age in months, rounded down.
        When the age is less than 6 months, reports the age in weeks, rounded down.
        When the age is less than 2 weeks, reports the age in days.
    '''
    today = datetime.date.today()
    age_in_years = today.year - born.year - ((today.month, today.day) < (born.month, born.day))
    months = (today.month - born.month - (today.day < born.day)) %12
    age = today - born
    age_in_days = age.days
    if age_in_years >= 80:
        return 80, 'years or older'
    if age_in_years >= 12:
        return age_in_years, 'years'
    elif age_in_years >= 2:
        half = 'and a half ' if months > 6 else ''
        return age_in_years, '%syears'%half
    elif months >= 6:
        return months, 'months'
    elif age_in_days >= 14:
        return age_in_days/7, 'weeks'
    else:
        return age_in_days, 'days'

কোডের উদাহরণ:

print '%d %s' %calculate_age(datetime.date(1933,6,12)) # >=80 years
print '%d %s' %calculate_age(datetime.date(1963,6,12)) # >=12 years
print '%d %s' %calculate_age(datetime.date(2010,6,19)) # >=2 years
print '%d %s' %calculate_age(datetime.date(2010,11,19)) # >=2 years with half
print '%d %s' %calculate_age(datetime.date(2014,11,19)) # >=6 months
print '%d %s' %calculate_age(datetime.date(2015,6,4)) # >=2 weeks
print '%d %s' %calculate_age(datetime.date(2015,7,11)) # days old

80 years or older
52 years
5 years
4 and a half years
7 months
6 weeks
7 days

1

যেহেতু আমি সঠিক বাস্তবায়নটি দেখতে পেলাম না, আমি আমার এইভাবে আবার সংশোধন করেছি ...

    def age_in_years(from_date, to_date=datetime.date.today()):
  if (DEBUG):
    logger.debug("def age_in_years(from_date='%s', to_date='%s')" % (from_date, to_date))

  if (from_date>to_date): # swap when the lower bound is not the lower bound
    logger.debug('Swapping dates ...')
    tmp = from_date
    from_date = to_date
    to_date = tmp

  age_delta = to_date.year - from_date.year
  month_delta = to_date.month - from_date.month
  day_delta = to_date.day - from_date.day

  if (DEBUG):
    logger.debug("Delta's are : %i  / %i / %i " % (age_delta, month_delta, day_delta))

  if (month_delta>0  or (month_delta==0 and day_delta>=0)): 
    return age_delta 

  return (age_delta-1)

২৯ শে ফেব্রুয়ারি জন্মগ্রহণ করার সময় ২৮ শে ফেব্রুয়ারি "18" হওয়ার ধারণাটি ভুল। সীমা অদলবদল করা ছেড়ে দেওয়া যেতে পারে ... এটি আমার কোডের জন্য কেবল একটি ব্যক্তিগত সুবিধা :)



1
import datetime

আজকের তারিখ

td=datetime.datetime.now().date() 

আপনার জন্ম তারিখ

bd=datetime.date(1989,3,15)

আপনার বয়স

age_years=int((td-bd).days /365.25)

0

তারিখের সময় আমদানি করুন

def age(date_of_birth):
    if date_of_birth > datetime.date.today().replace(year = date_of_birth.year):
        return datetime.date.today().year - date_of_birth.year - 1
    else:
        return datetime.date.today().year - date_of_birth.year

তোমার ক্ষেত্রে:

import datetime

# your model
def age(self):
    if self.birthdate > datetime.date.today().replace(year = self.birthdate.year):
        return datetime.date.today().year - self.birthdate.year - 1
    else:
        return datetime.date.today().year - self.birthdate.year

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