Yalnızca günlerle çalışırken "datetime.timedelta" ve "dateutil.relativedelta.relativedelta" arasındaki fark nedir?


91

datetime.timedelta(Python'un standart kütüphanesinden) ile dateutil.relativedelta.relativedeltasadece günlerle çalışırken arasındaki fark nedir ?

Anladığım kadarıyla, timedeltayalnızca günleri (ve haftaları) relativedeltadesteklerken, yıl, ay, hafta veya gün olarak tanımlanan dönemler için destek eklerken yıl, ay veya gün için mutlak değerler tanımlıyor. (unutmayın, bu soru için saatler, dakikalar veya saniyeler için endişelenmeme gerek yok)

Sadece ile çalışıyorum düşünülürse datetime.datenesneler ve sadece arasındaki fark nedir, gün sayısına göre belirlenen süreler ile ilgilenen timedeltave relativedelta? Herhangi bir fark var mı?

from datetime import date, timedelta
from dateutil.relativedelta import relativedelta

i = -1  # This could have been any integer, positive or negative
someday = date.today()
# Is there any difference between these two lines?
otherday = someday + timedelta(days=i)
otherday = someday + relativedelta(days=i)

3
Tarihler arasındaki günlerde yalnızca deltalarla ilgileniyorsanız, dateime.timedeltaistediğinizi elde edecek ve harici dateutilpakete bağımlılıktan kaçınacak standart kitaplığı kullanın .
Pedro Romano

Ekstra bağımlılıktan tasarruf etmenin yanı sıra, tarihler arasındaki günlerde deltaların hesaplanmasının, timedelta ile relativedelta'dan birkaç kat daha hızlı olduğunu söylemeye değer. (~ 10 kez)
Julien B.

Yanıtlar:


77

dateutilpython standart datetimemodülünün bir uzantı paketidir . Dediğiniz gibi, bir günden daha büyük birimlerle ifade edilen timedeltas gibi ekstra işlevsellik sağlar.

Bu, kız arkadaşımın doğum günü gelmeden önce kaç ay tasarruf edebilirim veya ayın son cuma günü gibi sorular sormanız gerektiğinde kullanışlıdır. Bu, ayların farklı uzunluklarının veya artık yıllarda fazladan günlerin neden olduğu karmaşık hesaplamaları gizler.

Sizin durumunuzda, sadece gün sayısı ile ilgileniyorsunuz. Pakete timedeltafazladan bağımlılığı ortadan kaldırdığı için en iyisi kullanmanız gerekir dateutil.


33

A relativedelta, a'dan çok daha fazla parametreye sahiptir timedelta:

Definition:   relativedelta.relativedelta(self, dt1=None, dt2=None,
years=0, months=0, days=0, leapdays=0, weeks=0, hours=0, minutes=0,
seconds=0, microseconds=0, year=None, month=None, day=None,
weekday=None, yearday=None, nlyearday=None, hour=None, minute=None,
second=None, microsecond=None)

bir ayın son Cuma gününü hesaplamak gibi şeyler yapabileceğiniz

In [14]: import datetime as dt

In [15]: import dateutil.relativedelta as relativedelta

In [16]: today = dt.date.today()

In [17]: rd = relativedelta.relativedelta(day = 31, weekday = relativedelta.FR(-1))

In [18]: today+rd
Out[18]: datetime.date(2012, 9, 28)

1
Bu harika bir cevap, relativedelta'yı "ayın son cuma günü" gibi şeyler için kullanma konusunda yeni bilgiler veren harika bir cevap :) Teşekkürler!
PascalVKooten

12

Diğer cevaplarda vurgulanmayan önemli bir fark, ilkel her zaman farkı için tekil ve çoğul isimlerin varlığıdır. İken timedeltasadece teklifler isimleri çoğul (örn hours, days) göreli zaman farkını, göstermek için relativedeltade (örneğin olarak teklifler tekil isimler hour, day) mutlak zaman bilgilerini göstermek için.

Bu, 2 sınıfın tanımından anlaşılır:

Definition:   datetime.timedelta([days[, seconds[, microseconds[, 
milliseconds[, minutes[, hours[, weeks]]]]]]])

Definition:   relativedelta.relativedelta(self, dt1=None, dt2=None,
years=0, months=0, days=0, leapdays=0, weeks=0, hours=0, minutes=0,
seconds=0, microseconds=0, year=None, month=None, day=None,
weekday=None, yearday=None, nlyearday=None, hour=None, minute=None,
second=None, microsecond=None)

Şimdi, tekil biçim tam olarak ne yapıyor? Tekil Form a ilave delta oluşturur datetimeilkel belirli bir tarih / zaman bu nesne setleri datetimebu nesne sözü relativedelta. İşte küçük bir örnek:

>>> import datetime as dt; from dateutil.relativedelta import *
>>> NOW = dt.datetime(2018, 11, 17, 9, 6, 31)
>>> NOW
datetime.datetime(2018, 11, 17, 9, 6, 31)
>>> NOW + relativedelta(hours=1) #Simply add one hour
datetime.datetime(2018, 11, 17, 10, 6, 31)
>>> NOW + relativedelta(hour=1) #Set the hour to 01:00 am
datetime.datetime(2018, 11, 17, 1, 6, 31)

Bu, relativedeltakullanımı karmaşık hale getirebilecek bazı ilginç uygulamalarda kullanılmasına yol açabilir timedelta. Akla gelen, yuvarlanan bir şeydir.

İlginç Bir Uygulama: Hızla Yuvarlama

Şimdi size relativedeltabir datetimenesneyi en yakın dakikaya, saate, güne vb. Yuvarlarken nasıl daha anlamlı olduğunu göstereceğim .

En yakın saate yuvarlama:

Aşağıdakileri kullanarak yuvarlamanın ne kadar kolay olduğuna dikkat edin relativedelta:

#Using `relativedelta`
NOW + relativedelta(hours=1, minute=0, second=0, microsecond=0)

#Using `timedelta`
dt.combine(NOW.date(),dt.time(NOW.hour,0,0)) + dt.timedelta(0,60*60,0)

Diğer daha karmaşık yuvarlamalar kullanılarak kolayca elde edilebilir relativedelta. Bununla birlikte, yapılabilecek tüm yuvarlamaların işlevler relativedeltakullanılarak datetimeve timedeltayalnızca biraz daha kıvrımlı bir şekilde de yapılabileceğini unutmayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.