Как найти разницу дат python

Using datetime example

>>> from datetime import datetime
>>> then = datetime(2012, 3, 5, 23, 8, 15)        # Random date in the past
>>> now  = datetime.now()                         # Now
>>> duration = now - then                         # For build-in functions
>>> duration_in_s = duration.total_seconds()      # Total number of seconds between dates

Duration in years

>>> years = divmod(duration_in_s, 31536000)[0]    # Seconds in a year=365*24*60*60 = 31536000.

Duration in days

>>> days  = duration.days                         # Build-in datetime function
>>> days  = divmod(duration_in_s, 86400)[0]       # Seconds in a day = 86400

Duration in hours

>>> hours = divmod(duration_in_s, 3600)[0]        # Seconds in an hour = 3600

Duration in minutes

>>> minutes = divmod(duration_in_s, 60)[0]        # Seconds in a minute = 60

Duration in seconds

[!] See warning about using duration in seconds in the bottom of this post

>>> seconds = duration.seconds                    # Build-in datetime function
>>> seconds = duration_in_s

Duration in microseconds

[!] See warning about using duration in microseconds in the bottom of this post

>>> microseconds = duration.microseconds          # Build-in datetime function

Total duration between the two dates

>>> days    = divmod(duration_in_s, 86400)        # Get days (without [0]!)
>>> hours   = divmod(days[1], 3600)               # Use remainder of days to calc hours
>>> minutes = divmod(hours[1], 60)                # Use remainder of hours to calc minutes
>>> seconds = divmod(minutes[1], 1)               # Use remainder of minutes to calc seconds
>>> print("Time between dates: %d days, %d hours, %d minutes and %d seconds" % (days[0], hours[0], minutes[0], seconds[0]))

or simply:

>>> print(now - then)

Edit 2019
Since this answer has gained traction, I’ll add a function, which might simplify the usage for some

from datetime import datetime

def getDuration(then, now = datetime.now(), interval = "default"):

    # Returns a duration as specified by variable interval
    # Functions, except totalDuration, returns [quotient, remainder]

    duration = now - then # For build-in functions
    duration_in_s = duration.total_seconds() 
    
    def years():
      return divmod(duration_in_s, 31536000) # Seconds in a year=31536000.

    def days(seconds = None):
      return divmod(seconds if seconds != None else duration_in_s, 86400) # Seconds in a day = 86400

    def hours(seconds = None):
      return divmod(seconds if seconds != None else duration_in_s, 3600) # Seconds in an hour = 3600

    def minutes(seconds = None):
      return divmod(seconds if seconds != None else duration_in_s, 60) # Seconds in a minute = 60

    def seconds(seconds = None):
      if seconds != None:
        return divmod(seconds, 1)   
      return duration_in_s

    def totalDuration():
        y = years()
        d = days(y[1]) # Use remainder to calculate next variable
        h = hours(d[1])
        m = minutes(h[1])
        s = seconds(m[1])

        return "Time between dates: {} years, {} days, {} hours, {} minutes and {} seconds".format(int(y[0]), int(d[0]), int(h[0]), int(m[0]), int(s[0]))

    return {
        'years': int(years()[0]),
        'days': int(days()[0]),
        'hours': int(hours()[0]),
        'minutes': int(minutes()[0]),
        'seconds': int(seconds()),
        'default': totalDuration()
    }[interval]

# Example usage
then = datetime(2012, 3, 5, 23, 8, 15)
now = datetime.now()

print(getDuration(then)) # E.g. Time between dates: 7 years, 208 days, 21 hours, 19 minutes and 15 seconds
print(getDuration(then, now, 'years'))      # Prints duration in years
print(getDuration(then, now, 'days'))       #                    days
print(getDuration(then, now, 'hours'))      #                    hours
print(getDuration(then, now, 'minutes'))    #                    minutes
print(getDuration(then, now, 'seconds'))    #                    seconds

Warning: Caveat about built-in .seconds and .microseconds
datetime.seconds and datetime.microseconds are capped to [0,86400) and [0,10^6) respectively.

They should be used carefully if timedelta is bigger than the max returned value.

Examples:

end is 1h and 200μs after start:

>>> start = datetime(2020,12,31,22,0,0,500)
>>> end = datetime(2020,12,31,23,0,0,700)
>>> delta = end - start
>>> delta.microseconds
RESULT: 200
EXPECTED: 3600000200

end is 1d and 1h after start:

>>> start = datetime(2020,12,30,22,0,0)
>>> end = datetime(2020,12,31,23,0,0)
>>> delta = end - start
>>> delta.seconds
RESULT: 3600
EXPECTED: 90000

I have two different dates and I want to know the difference in days between them. The format of the date is YYYY-MM-DD.

I have a function that can ADD or SUBTRACT a given number to a date:

def addonDays(a, x):
   ret = time.strftime("%Y-%m-%d",time.localtime(time.mktime(time.strptime(a,"%Y-%m-%d"))+x*3600*24+3600))      
   return ret

where A is the date and x the number of days I want to add. And the result is another date.

I need a function where I can give two dates and the result would be an int with date difference in days.

codeforester's user avatar

codeforester

38.6k16 gold badges108 silver badges135 bronze badges

asked Dec 7, 2011 at 17:17

mauguerra's user avatar

2

Use - to get the difference between two datetime objects and take the days member.

from datetime import datetime

def days_between(d1, d2):
    d1 = datetime.strptime(d1, "%Y-%m-%d")
    d2 = datetime.strptime(d2, "%Y-%m-%d")
    return abs((d2 - d1).days)

answered Dec 7, 2011 at 17:22

Fred Foo's user avatar

Fred FooFred Foo

353k75 gold badges736 silver badges831 bronze badges

11

Another short solution:

from datetime import date

def diff_dates(date1, date2):
    return abs(date2-date1).days

def main():
    d1 = date(2013,1,1)
    d2 = date(2013,9,13)
    result1 = diff_dates(d2, d1)
    print '{} days between {} and {}'.format(result1, d1, d2)
    print ("Happy programmer's day!")

main()

answered Sep 13, 2013 at 21:03

0x8BADF00D's user avatar

0x8BADF00D0x8BADF00D

7,0202 gold badges41 silver badges34 bronze badges

2

You can use the third-party library dateutil, which is an extension for the built-in datetime.

Parsing dates with the parser module is very straightforward:

from dateutil import parser

date1 = parser.parse('2019-08-01')
date2 = parser.parse('2019-08-20')

diff = date2 - date1

print(diff)
print(diff.days)

Answer based on the one from this deleted duplicate

I tried the code posted by larsmans above but, there are a couple of problems:

1) The code as is will throw the error as mentioned by mauguerra
2) If you change the code to the following:

...
    d1 = d1.strftime("%Y-%m-%d")
    d2 = d2.strftime("%Y-%m-%d")
    return abs((d2 - d1).days)

This will convert your datetime objects to strings but, two things

1) Trying to do d2 – d1 will fail as you cannot use the minus operator on strings and
2) If you read the first line of the above answer it stated, you want to use the – operator on two datetime objects but, you just converted them to strings

What I found is that you literally only need the following:

import datetime

end_date = datetime.datetime.utcnow()
start_date = end_date - datetime.timedelta(days=8)
difference_in_days = abs((end_date - start_date).days)

print difference_in_days

answered Oct 8, 2012 at 15:23

schalkneethling's user avatar

schalkneethlingschalkneethling

6,2623 gold badges20 silver badges20 bronze badges

1

Try this:

data=pd.read_csv('C:UsersDesktopData Exploration.csv')
data.head(5)
first=data['1st Gift']
last=data['Last Gift']
maxi=data['Largest Gift']
l_1=np.mean(first)-3*np.std(first)
u_1=np.mean(first)+3*np.std(first)


m=np.abs(data['1st Gift']-np.mean(data['1st Gift']))>3*np.std(data['1st Gift'])
pd.value_counts(m)
l=first[m]
data.loc[:,'1st Gift'][m==True]=np.mean(data['1st Gift'])+3*np.std(data['1st Gift'])
data['1st Gift'].head()




m=np.abs(data['Last Gift']-np.mean(data['Last Gift']))>3*np.std(data['Last Gift'])
pd.value_counts(m)
l=last[m]
data.loc[:,'Last Gift'][m==True]=np.mean(data['Last Gift'])+3*np.std(data['Last Gift'])
data['Last Gift'].head()

Ryan's user avatar

Ryan

1,9722 gold badges23 silver badges36 bronze badges

answered Jul 24, 2017 at 18:07

user8359392's user avatar

I tried a couple of codes, but end up using something as simple as (in Python 3):

from datetime import datetime
df['difference_in_datetime'] = abs(df['end_datetime'] - df['start_datetime'])

If your start_datetime and end_datetime columns are in datetime64[ns] format, datetime understands it and return the difference in days + timestamp, which is in timedelta64[ns] format.

If you want to see only the difference in days, you can separate only the date portion of the start_datetime and end_datetime by using (also works for the time portion):

df['start_date'] = df['start_datetime'].dt.date
df['end_date'] = df['end_datetime'].dt.date

And then run:

df['difference_in_days'] = abs(df['end_date'] - df['start_date'])

answered Oct 2, 2020 at 13:20

Marcus Trugilho's user avatar

0

pd.date_range(‘2019-01-01’, ‘2019-02-01’).shape[0]

answered Jun 5, 2019 at 20:54

ar91's user avatar

2

Datetime — важный элемент любой программы, написанной на Python. Этот модуль позволяет управлять датами и временем, представляя их в таком виде, в котором пользователи смогут их понимать.

datetime включает различные компоненты. Так, он состоит из объектов следующих типов:

  • date — хранит дату
  • time — хранит время
  • datetime — хранит дату и время

Как получить текущие дату и время?

С помощью модуля Python это сделать очень просто. Сначала нужно импортировать класс datetime из модуля datetime, после чего создать объект datetime. Модуль предоставляет метод now(), который возвращает текущие дату и время с учетом локальных настроек.


import datetime

dt_now = datetime.datetime.now()
print(dt_now)

А вот результат:

2020-11-14 15:43:32.249588

Класс date можно использовать для получения или изменения объектов даты. Например, для получения текущей с учетом настроек подойдет следующее:


from datetime import date

current_date = date.today()
print(current_date)

Результат:

2020-11-14

Текущая дата — 2020-11-14 в формате год-месяц-день соответственно.

Получить текущее время

Для получения текущего локального времени сперва нужно получить текущие дату и время, а затем достать из этого объекта только время с помощью метода time():


import datetime

current_date_time = datetime.datetime.now()
current_time = current_date_time.time()
print(current_time)

Результат:

15:51:05.627643

Компоненты datetime в Python

Модуль datetime в Python может использоваться для получения разных версий времени. Для этого нужно ознакомиться с атрибутами модуля. Используем для этого функцию dir().


import datetime

attr = dir(datetime)
print(attr)
# ['MAXYEAR', 'MINYEAR', '__doc__', '__name__', '__package__', 'date', 'datetime',
# 'datetime_CAPI', 'time', 'timedelta', 'tzinfo']

В этом руководстве речь пойдет о следующих элементах:

  • date — объекты даты
  • datetime — объекты даты и времени
  • time — объекты времени
  • timedelta — этот атрибут покрывает интервалы и используется для определения прошлых или будущих событий
  • Tzinfo — этот атрибут отвечает за часовые пояса

Как создавать объекты даты и времени

Для создания объекта времени используется класс time из модуля datetime в Python. Синтаксис следующий: datetime.time(hour, minutes, seconds).

В этом примере создается объект времени представленный следующим образом (8, 48, 45).


import datetime

timeobj= datetime.time(8,48,45)
print(timeobj)

Результат такой:

08:48:45

Сначала импортируется модуль datetime. После этого создается экземпляр класса (объект time). Затем ему присваивается значение datetime.time(8, 48, 45), где параметры 8, 48 и 45 представляют собой часы, минуты и секунды соответственно.

Для создания объекта даты нужно передать дату с использованием следующего синтаксиса:

datetime.datetime(year,month,day))

Такой пример:


import datetime

date_obj = datetime.datetime(2020,10,17)
print(date_obj)

Вернет вот такой результат:

2020-10-17 00:00:00

Timedelta

timedelta представляет длительность (даты или времени). Модуль datetime включает атрибут timedelta(), который используется для управления датой в Python. Объект timedelta выглядит следующим образом:


td_object =timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
td_object
datetime.timedelta(0)

Все аргументы опциональные и их значения по умолчанию равно 0. Они могут быть целыми или числами с плавающей точкой, как положительными, так и отрицательными. Благодаря этому можно выполнять математические операции, такие как сложение, вычитание и умножение.

Как вычислить разницу для двух дат

Посмотрим на несколько примеров вычисления разницы во времени. Предположим, есть два объекта datetime:

first_date = date(2020, 10, 2)
second_date = date(2020, 10, 30)

Для получения разницы нужно лишь вычесть значение одного объекта из второго:


from datetime import date

first_date = date(2020, 10, 2)
second_date = date(2020, 10, 30)
delta = second_date - first_date
print(delta)

Результат:

28 days,0:00:00

Таким образом между 2 и 30 октября 2020 года 28 дней.

Как вычислить разницу двух объектов datetime.time

С помощью timedelta нельзя выполнять манипуляции над объектами time. Например:


from datetime import datetime, timedelta

current_datetime = datetime.now()
current_time = current_datetime.time()
print("Текущее время:", current_time)
tm_after_1_hr = current_time + timedelta(hours=1)
print(tm_after_1_hr)

Такой код вернет следующую ошибку:

Traceback (most recent call last):
  File "C:UsersalexAppDataLocalProgramsPythonPython38sg_verify.py", line 6, in 
    tm_after_1_hr = current_time + timedelta(hours=1)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta'

Как получать прошлые и будущие даты с помощью timedelta

Поскольку timedelta — это длительность, то для получения прошлой или будущей даты нужно добавить объект timedelta к существующему или вычесть из него же. Вот пример нескольких уравнений, где n — это целое число, представляющее количество дней:


import datetime

current_date = datetime.datetime.today()
past_date = datetime.datetime.today() – datetime.timedelta(days=n)
future_date = datetime.datetime.today() – datetime.timedelta(days=n)

Если нужно, например, получить дату за прошлые две недели, то достаточно вычесть 14 дней из текущей даты:


import datetime

past_date = datetime.datetime.today() - datetime.timedelta(days=14)
print(past_date)

Результат:

2020-10-31 16:12:09.142258

Предположим, вы задумали практиковать определенный навык в течение 21 дня. Для получения будущей даты нужно добавить 21 день к текущей дате:


import datetime

future_date = datetime.datetime.today() + datetime.timedelta(days=21)
print(future_date)

Результат:

2020-12-05 16:14:09.718325

Другие арифметические операции с timedelta

Значения даты и времени могут сравниваться для определения того, какая из них была раньше или позже. Например:


import datetime

now = datetime.time(9, 31, 0)
next_hour = datetime.time(10, 31, 0)
print('now < next_hour:', now < next_hour) today = datetime.date.today() next_week = datetime.date.today() + datetime.timedelta(days=7) print('today > next_week:', today > next_week)

Результат:

now < next_hour: True
today > next_week: False

Часовые пояса

Пока что мы работали с datetime без учета часовых поясов и летнего времени. Но прежде чем переходить к следующим пунктам, нужно разобраться с разницей в абсолютных (naive) и относительных (aware) датах.

Абсолютные даты не содержат информацию, которая бы могла определить часовой пояс или летнее время. Однако с такими намного проще работать.

Относительные же содержат достаточно информации для определения часового пояса или отслеживания изменений из-за летнего времени.

Разница между DST, GMT и UTC

  1. GMT
    Официальный часовой пояс, используемый в некоторых странах Европы и Африки. Он может быть представлен как в 24, так и в 12-часовом форматах. GMT используется для того, чтобы задавать местное время. Например, местное время для Берлина 2020–10–17 09:40:33.614581+02:00 GMT. Для Найроби же это — 2020–10–17 10:40:33.592608+03:00 GMT.
  2. DST (летнее время)
    Страны, которые переходят на летнее время, делают это для того, чтобы дневное время длилось как можно дольше. Во время летнего времени они переводят стрелки своих часов на час вперед и возвращаются обратно осенью.
  3. UTC (всемирное координированное время)
    Временной стандарт для часовых поясов во всем мире. Он позволяет синхронизировать время во всем мире и служит отправной точкой для остальных.

Как работать с часовыми поясами

Рассмотрим, как создать простой относительный объект datetime:


import datetime

dt_now = datetime.datetime.utcnow()
print(dt_now)

Эта программа возвращает объект с абсолютным значением datetime. Если же нужно сделать его абсолютным, то нужно явно указать часовой пояс. Как это сделать? В библиотеке datetime в Python нет модуля для работы с часовыми поясами. Для этого нужно использовать другие библиотеки. Одна из таких — pytz.

Предположим, нужно получить текущее время для Найроби. Для этого нужно использовать конкретный часовой пояс. Для начала можно с помощью pytz получить все существующие часовые пояса.


import pytz

pytz.all_timezones

Вот некоторые из них:

['Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa', 'Africa/Nairobi']

Для получения времени в Найроби:


import pytz
import datetime

tz_nairobi = pytz.timezone("Africa/Nairobi")
dt_nairobi =datetime.datetime.now(tz_nairobi)
print(dt_nairobi)

Результат:

2020-11-14 17:27:31.141255+03:00

А вот так можно получить время Берлина:


import pytz
import datetime

tz_berlin = pytz.timezone("Europe/Berlin")
dt_berlin =datetime.datetime.now(tz_berlin)
print(dt_berlin)

Результат:

2020-11-14 15:28:20.977529+01:00

Здесь можно увидеть разницу в часовых поясах разных городов, хотя сама дата одна и та же.

Конвертация часовых поясов

При конвертации часовых поясов в первую очередь нужно помнить о том, что все атрибуты представлены в UTC. Допустим, нужно конвертировать это значение в America/New_York:


import datetime
import pytz

timezone_berlin = '2019-06-29 17:08:00'
tz_ber_obj = datetime.datetime.strptime(timezone_berlin, '%Y-%m-%d %H:%M:%S')
timezone_newyork = pytz.timezone('America/New_York')
timezone_newyork_obj = timezone_newyork.localize(tz_ber_obj)
print(timezone_newyork_obj)
print(timezone_newyork_obj.tzinfo)

Результат:

2019-06-29 17:08:00-04:00
America/New_York

Другие практические примеры

Всегда храните даты в UTC. Вот примеры:


import datetime
import pytz

time_now = datetime.datetime.now(pytz.utc)
print(time_now)

Результат для этого кода — 2020-11-14 14:38:46.462397+00:00, хотя локальное время может быть, например, таким 2020-11-14 16:38:46.462397+00:00. А уже при демонстрации даты пользователю стоит использовать метод localize с местными настройками:


import datetime
import pytz

now = datetime.datetime.today()
now_utc = pytz.utc.localize(now)

Вернет текущее локальное время — 2020-11-14 16:42:38.228528+00:00.

Как конвертировать строки в datetime

strptime() в Python — это метод из модуля datetime. Вот его синтаксис:

dateobj = datetime.strptime(date_string, format)

Аргументы формата необязательные и являются строками. Предположим, нужно извлечь текущие дату и время:


import datetime

current_dt = datetime.datetime.now()
print(current_dt)

Результат:

2020-11-14 16:50:45.049229

Результат будет в формате ISO 8601, то есть YYYY-MM-DDTHH:MM:SS.mmmmmm — формат по умолчанию, что позволяет получать строки в едином формате.

Таблица форматов:

Символ Описание Пример
%a День недели, короткий вариант Wed
%A Будний день, полный вариант Wednesday
%w День недели числом 0-6, 0 — воскресенье 3
%d День месяца 01-31 31
%b Название месяца, короткий вариант Dec
%B Название месяца, полное название December
%m Месяц числом 01-12 12
%y Год, короткий вариант, без века 18
%Y Год, полный вариант 2018
%H Час 00-23 17
%I Час 00-12 05
%p AM/PM PM
%M Минута 00-59 41
%S Секунда 00-59 08
%f Микросекунда 000000-999999 548513
%z Разница UTC +0100
%Z Часовой пояс CST
%j День в году 001-366 365
%U Неделя числом в году, Воскресенье первый день недели, 00-53 52
%W Неделя числом в году, Понедельник первый день недели, 00-53 52
%c Локальная версия даты и времени Mon Dec 31 17:41:00 2018
%x Локальная версия даты 12/31/18
%X Локальная версия времени 17:41:00
%% Символ “%” %

import datetime

date_string = "11/17/20"
date_obj = datetime.datetime.strptime(date_string, '%m/%d/%y')
print(date_obj)

Результат:

2020-11-17 00:00:00

Примеры конвертации строки в объект datetime с помощью strptime

Предположим, что есть следующая строка с датой: «11/17/20 15:02:34», и ее нужно конвертировать в объект datetime.


from datetime import datetime

datetime_string = "11/17/20 15:02:34"
datetime_obj = datetime.strptime(datetime_string, '%m/%d/%y %H:%M:%S')
print(datetime_obj)

Результат:

2020-11-17 15:02:34

Даты могут быть записаны в разных форматах. Например, следующие даты отличаются лишь представлением:

  • Friday, November 17, 2020;
  • 11/17/20;
  • 11–17–2020.

Вот как это работает:


from datetime import datetime

# создадим даты как строки
ds1 = 'Friday, November 17, 2020'
ds2 = '11/17/20'
ds3 = '11-17-2020'

# Конвертируем строки в объекты datetime и сохраним
dt1 = datetime.strptime(ds1, '%A, %B %d, %Y')
dt2 = datetime.strptime(ds2, '%m/%d/%y')
dt3 = datetime.strptime(ds3, '%m-%d-%Y')

print(dt1)
print(dt2)
print(dt3)

Результат будет одинаковым для всех форматов:

2020-11-17 00:00:00
2020-11-17 00:00:00
2020-11-17 00:00:00

Практические примеры

Если строка представлена в формате «Oct 17 2020 9:00PM», то ее можно конвертировать следующим образом:


date_string = 'Oct 17 2020 9:00PM'
date_object = datetime.strptime(date_string, '%b %d %Y %I:%M%p')
print(date_object)

Результат — 2020-10-17 21:00:00.

Функцию strptime() можно использовать для конвертации строки в объект даты:


from datetime import datetime

date_string = '10-17-2020'
date_object = datetime.strptime(date_string, '%m-%d-%Y').date()
print(type(date_object))
print(date_object)

Результат:


2020-10-17

Как конвертировать объект datetime в строку

Модуль datetime в Python содержит метод strftime(), который делает обратное (то есть, конвертирует объект datetime и time в строки). Вот его синтаксис:

datetime_string = datetime_object.strftime(format_string)
time_string = datetime_object.strftime(format_string[,time_object])

Примеры конвертации datetime в строку с помощью strftime()

Предположим, нужно конвертировать текущий объект datetime в строку. Сначала нужно получить представление объекта datetime и вызвать на нем метод strftime().


import datetime

current_date = datetime.datetime.now()
current_date_string = current_date.strftime('%m/%d/%y %H:%M:%S')
print(current_date_string)

Результат — 11/14/20 17:15:03.

Как получить строковое представление даты и времени с помощью функции format()

Пример №1. Конвертация текущей временной метки в объекте datetime в строку в формате «DD-MMM-YYYY (HH:MM:SS:MICROS)»:


import datetime

dt_obj =datetime.datetime.now()
dt_string = dt_obj.strftime("%d-%b-%Y (%H:%M:%S.%f)")
print('Текущее время : ', dt_string)

Результат:

Текущее время :  14-Nov-2020 (17:18:09.890960)

Пример №2. Конвертация текущей временной метки объекта datetime в строку в формате «HH:MM:SS.MICROS – MMM DD YYYY».


import datetime

dt_obj =datetime.datetime.now()
dt_string = dt_obj.strftime("%H:%M:%S.%f - %b %d %Y")
print('Текущее время : ', dt_string)

Результат:

Текущее время :  17:20:28.841390 - Nov 14 2020

Другие datetime-библиотеки в Python

В Python есть и другие библиотеки, которые упрощают процесс манипуляций с объектами datetime. В некоторых из них есть поддержка часовых поясов.

Arrow

Arrow — еще один популярный модуль, который делает более простым процесс создания, управления и форматирования дат и времени. Получить его можно с помощью pip. Для установки достаточно ввести pip install arrow.

Arrow можно использовать для получения текущего времени по аналогии с модулем datetime:


import arrow

current_time = arrow.now()
print(current_time)
print(current_time.to('UTC'))

Результат:

2020-11-14T15:52:58.921198+00:00
2020-11-14T15:52:58.921198+00:00

Maya

Maya упрощает процесс парсинга строк и конвертации часовых поясов. Например:


import maya

dt = maya.parse('2019-10-17T17:45:25Z').datetime()
print(dt.date())
print(dt)
print(dt.time())

Результат:

2019-10-17
2019-10-17 17:45:25+00:00
17:45:25

Dateutil

Dateutil — это мощная библиотека, которая используется для парсинга дат и времени в разных форматах. Вот некоторые примеры.


from dateutil import parser

dt_obj = parser.parse('Thu Oct 17 17:10:28 2019')
print(dt_obj) dt_obj1=parser.parse('Thursday, 17. October 2019 5:10PM')
print(dt_obj1) dt_obj2=parser.parse('10/17/2019 17:10:28')
print(dt_obj2) t_obj=parser.parse('10/17/2019')
print(t_obj)

Результат:

2019-10-17 17:10:28
2019-10-17 17:10:00
2019-10-17 17:10:28
2010-10-17 00:00:00

Важно, что в этом случае не нужны регулярные выражения при определении формата. Парсер ищет узнаваемые токены и либо возвращает корректный результат, либо выдает ошибку.

Важные нюансы

Вот о чем важно помнить при работе с datetime в Python:

  • Рекомендуется всегда работать с UTC. Это позволяет не думать о часовых поясах, что часто приводит к ошибкам из-за разницы во времени в разных регионах.
  • Дату и время стоит конвертировать в локальную только при выводе пользователю.

Выводы

Есть масса сценариев работы с датой и временем в реальных приложениях. Например:

  • Запланировать работу скрипта на определенное время.
  • Отфильтровать даты.
  • Извлечь дату из определенных API каждый день, в определенное время.
  • Приложения для отслеживания событий, записей, бронирования и так далее.

After reading this article, you’ll learn how to find the difference between two dates in Python. Also, we’ll see how to calculate the number of days between two dates and datetime objects.

Table of contents

  • How to Calculate Difference Between Two Dates in Days
    • Example: Days between two dates
  • Difference between two date object
  • Difference between two datetime object

How to Calculate Difference Between Two Dates in Days

Dates can be in any form, such as string, date object, or datetime object. we will see the example of all cases.

Python provides the datetime module to create and manipulate the date and time. The below steps show how to use the datetime module to calculate the difference between two dates in days.

  1. Import datetime module

    Python datetime module provides various functions to create and manipulate the date and time. Use the from datetime import datetime statement to import a datetime class from a datetime module.

  2. Convert date string to a datetime object

    There may be a case in which dates are in a string format. Before calculating the difference in days, we need to convert both date strings to a datetime object.
    Use the strptime(date_str, format) function to convert a date string into a datetime object as per the corresponding format.
    The format codes are standard directives for mentioning the format of the string for parsing. For example, the %Y/%m/%d format codes are for yyyy-mm-dd

  3. Subtract the date2 from date1

    To get the difference between two dates, subtract date2 from date1. A result is a timedelta object. The timedelta represents a duration which is the difference between two dates, time, or datetime instances, to the microsecond resolution.

  4. Get a difference in days

    To get the number of days between two dates, use the timedelta.days attribute

  5. Get the difference in seconds

    To get a result in seconds, use the timedelta.seconds attribute

Example: Days between two dates

from datetime import datetime

# dates in string format
str_d1 = '2021/10/20'
str_d2 = '2022/2/20'

# convert string to date object
d1 = datetime.strptime(str_d1, "%Y/%m/%d")
d2 = datetime.strptime(str_d2, "%Y/%m/%d")

# difference between dates in timedelta
delta = d2 - d1
print(f'Difference is {delta.days} days')

Output:

Difference is 123 days

Shortcode:

from datetime import datetime as dt

res = (dt.strptime('2022/2/20', "%Y/%m/%d") - dt.strptime('2021/10/20', "%Y/%m/%d")).days

Also, see:

  • Difference between the two dates in months.
  • Time Difference between two-time in Python.
  • Calculate the business days between two dates in Python.

Difference between two date object

There are cases in which you receive dates in a date object instead of a string. In such cases, you can directly calculate the difference between them by performing the subtraction operation.

Example:

from datetime import date

def get_difference(date1, date2):
    delta = date2 - date1
    return delta.days

d1 = date(2021, 10, 20)
d2 = date(2022, 2, 20)
days = get_difference(d1, d2)
print(f'Difference is {days} days')

Output:

Difference is 123 days

Difference between two datetime object

We need to work with a datetime object instead of a date in some cases. The datetime object contains both date (year-month-day) and time (hours-minutes-seconds) information. Let’s see how to calculate the number of days between two datetime objects.

  • First, convert a datetime string to a datetime object using the strptime() function
  • Next, calculate the difference by subtracting datetime1 from datetime2.

Example:

from datetime import datetime

# datetime in string format
str_dt1 = '2021/10/20 09:15:32.36980'
str_dt2 = '2022/2/20 04:25:42.120450'

# convert string to datetime
dt1 = datetime.strptime(str_dt1, "%Y/%m/%d %H:%M:%S.%f")
dt2 = datetime.strptime(str_dt2, "%Y/%m/%d %H:%M:%S.%f")

# difference between datetime in timedelta
delta = dt2 - dt1
print(f'Difference is {delta.days} days')

Output:

Difference is 122 days

Note:

The Python timedelta object considers 24 hours as one day, and For calendar days, you’ll need to round down to the nearest day by removing the partial day on both sides. I.e., we need to set hour, minute, and seconds to zero in both datetime.

Example:

from datetime import datetime

# datetime in string format
str_dt1 = '2021/10/20 09:15:32.36980'
str_dt2 = '2022/2/20 04:25:42.120450'

# convert string to datetime
dt1 = datetime.strptime(str_dt1, "%Y/%m/%d %H:%M:%S.%f")
dt2 = datetime.strptime(str_dt2, "%Y/%m/%d %H:%M:%S.%f")

rounded_dt1 = dt1.replace(hour=0, minute=0, second=0, microsecond=0)
rounded_dt2 = dt2.replace(hour=0, minute=0, second=0, microsecond=0)
delta = (rounded_dt2 - rounded_dt1)
print(delta.days)

Python Exercises and Quizzes

Free coding exercises and quizzes cover Python basics, data structure, data analytics, and more.

  • 15+ Topic-specific Exercises and Quizzes
  • Each Exercise contains 10 questions
  • Each Quiz contains 12-15 MCQ

В этом руководстве покажу, как написать программу на Python, чтобы найти количество дней между двумя заданными числами.

Предположим, мы указали две даты, и наш ожидаемый результат будет:

 
Input: Date_1 = 12/10/2021, Date_2 = 31/08/2022 
Output: Number of Days between the given Dates are: 323 days 
Input: Date_1 = 10/09/2023, Date_2 = 04/02/2025 
Output: Number of Days between the given Dates are: 323 days: 513 days 

Метод 1: Naïve Approach

В этом подходе наивное решение будет начинаться с date_1 и будет продолжать считать количество дней, пока не достигнет date_2. Это решение потребует более O (1) раз. Это простое решение для подсчета общего количества дней до date_1, что означает, что он будет считать общее количество дней с 00/00/0000 до date_1, а затем будет подсчитывать общее количество дней до date_2. Наконец, он вернет разницу между двумя счетчиками в виде общего количества дней между двумя заданными датами.

Пример:

# First, we will create a class for dates 
class date_n: 
def __init__(self, day, month, year): 
self.day = day 
self.month = month 
self.year = year 


# For storng number of days in all months from 
# January to December. 
month_Days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] 

# This function will count the number of leap years from 00/00/0000 to the #given date 


def count_Leap_Years(day): 

years = day.year 

# Now, it will check if the current year should be considered for the count # of leap years or not. 
if (day.month <= 2): 
years -= 1 

# The condition for an year is a leap year: if te year is a multiple of 4, and a # multiple of 400 but not a multiple of 100. 
return int(years / 4) - int(years / 100) + int(years / 400) 


# This function will return number of days between two given dates 
def get_difference(date_1, date_2): 

# Now, it will count total number of days before first date "date_1" 

# Then, it will initialize the count by using years and day 
n_1 = date_1.year * 365 + date_1.day 

# then, it will add days for months in the given date 
for K in range(0, date_1.month - 1): 
n_1 += month_Days[K] 

# As every leap year is of 366 days, we will add 
# a day for every leap year 
n_1 += count_Leap_Years(date_1) 

# SIMILARLY, it will count total number of days before second date "date_2" 

n_2 = date_2.year * 365 + date_2.day 
for K in range(0, date_2.month - 1): 
n_2 += month_Days[K] 
n_2 += count_Leap_Years(date_2) 

# Then, it will return the difference between two counts 
return (n_2 - n_1) 


# Driver program 
date_1 = date_n(12, 10, 2021) 
date_2 = date_n(30, 8, 2022) 

print ("Number of Days between the given Dates are: ", get_difference(date_1, date_2), "days")

Вывод

Number of Days between the given Dates are:  322 days

В этом методе мы увидим, как мы можем использовать встроенную функцию Python «datetime», которая может помочь пользователям в решении различных проблем, связанных с датой и временем. Чтобы найти разницу между двумя датами, мы можем ввести две даты в формате типа даты и вычесть их, и это приведет к выводу в виде количества дней между двумя заданными датами.

from datetime import date as date_n  
   
def number_of_days(date_1, date_2):  
    return (date_2 - date_1).days  
       
# Driver program  
date_1 = date_n(2023, 9, 10)  
date_2 = date_n(2025, 2, 4)  
print ("Number of Days between the given Dates are: ", number_of_days(date_1, date_2), "days") 

Вывод

Number of Days between the given Dates are:  513 days

Изучаю Python вместе с вами, читаю, собираю и записываю информацию опытных программистов.

Добавить комментарий