Skip to main content

Python datetimes made easy.

Project description

Pendulum Build status

Python datetimes made easy.

Supports Python 2.7+ and 3.2+.

>>> import pendulum

>>> now_in_paris = pendulum.now('Europe/Paris')
>>> now_in_paris
'2016-07-04T00:49:58.502116+02:00'

# Seamless timezone switching
>>> now_in_paris.in_timezone('UTC')
'2016-07-03T22:49:58.502116+00:00'

>>> tomorrow = pendulum.now().add(days=1)
>>> last_week = pendulum.now().subtract(weeks=1)

>>> if pendulum.now().is_weekend():
...     print('Party!')
'Party!'

>>> past = pendulum.now().subtract(minutes=2)
>>> past.diff_for_humans()
>>> '2 minutes ago'

>>> delta = past - last_week
>>> delta.hours
23
>>> delta.in_words(locale='en')
'6 days 23 hours 58 minutes'

# Proper handling of datetime normalization
>>> pendulum.create(2013, 3, 31, 2, 30, 0, 0, 'Europe/Paris')
'2013-03-31T03:30:00+02:00' # 2:30 does not exist (Skipped time)

# Proper handling of dst transitions
>>> just_before = pendulum.create(2013, 3, 31, 1, 59, 59, 999999, 'Europe/Paris')
'2013-03-31T01:59:59.999999+01:00'
>>> just_before.add(microseconds=1)
'2013-03-31T03:00:00+02:00'

Why Pendulum?

Native datetime instances are enough for basic cases but when you face more complex use-cases they often show limitations and are not so intuitive to work with. Pendulum provides a cleaner and more easy to use API while still relying on the standard library. So it’s still datetime but better.

Unlike other datetime libraries for Python, Pendulum is a drop-in replacement for the standard datetime class (it inherits from it), so, basically, you can replace all your datetime instances by Pendulum instances in you code (exceptions exist for libraries that check the type of the objects by using the type function like sqlite3 or PyMySQL for instance).

It also removes the notion of naive datetimes: each Pendulum instance is timezone-aware and by default in UTC for ease of use.

Pendulum also improves the standard timedelta class by providing more intuitive methods and properties.

Why not Arrow?

Arrow is the most popular datetime library for Python right now, however its behavior and API can be erratic and unpredictable. The get() method can receive pretty much anything and it will try its best to return something while silently failing to handle some cases:

arrow.get('2016-1-17')
# <Arrow [2016-01-01T00:00:00+00:00]>

pendulum.parse('2016-1-17')
# <Pendulum [2016-01-17T00:00:00+00:00]>

# Parsing of a date with wrong day
arrow.get('2015-06-31')
# <Arrow [2015-06-01T00:00:00+00:00]>

pendulum.parse('2016-06-31')
# ValueError: day is out of range for month

# fromtimestamp with timezone displays wrong offset
arrow.Arrow.fromtimestamp(0, pytz.timezone('Europe/Paris'))
# <Arrow [1970-01-01T01:00:00+00:09]>

pendulum.from_timestamp(0, pytz.timezone('Europe/Paris'))
# fromtimestamp() is also possible
# <Pendulum [1970-01-01T01:00:00+01:00]>

# Working with DST
just_before = arrow.Arrow(2013, 3, 31, 1, 59, 59, 999999, 'Europe/Paris')
just_after = just_before.replace(microseconds=1)
'2013-03-31T02:00:00+02:00'
# Should be 2013-03-31T03:00:00+02:00

(just_after.to('utc') - just_before.to('utc')).total_seconds()
-3599.999999
# Should be 1e-06

just_before = pendulum.create(2013, 3, 31, 1, 59, 59, 999999, 'Europe/Paris')
just_after = just_before.add(microseconds=1)
'2013-03-31T03:00:00+02:00'

(just_after.in_timezone('utc') - just_before.in_timezone('utc')).total_seconds()
1e-06

Those are a few examples showing that Arrow cannot always be trusted to have a consistent behavior with the data you are passing to it.

Resources

Contributing

Contributions are welcome, especially with localization. Check the languages already supported, and if you want to add a new one, take the en file as a starting point and add tests accordingly.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pendulum-0.5.1.tar.gz (70.1 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pendulum-0.5.1-cp35-cp35m-manylinux1_x86_64.whl (148.5 kB view details)

Uploaded CPython 3.5m

pendulum-0.5.1-cp35-cp35m-manylinux1_i686.whl (146.2 kB view details)

Uploaded CPython 3.5m

pendulum-0.5.1-cp35-cp35m-macosx_10_11_x86_64.whl (110.2 kB view details)

Uploaded CPython 3.5mmacOS 10.11+ x86-64

pendulum-0.5.1-cp27-cp27m-manylinux1_x86_64.whl (146.4 kB view details)

Uploaded CPython 2.7m

pendulum-0.5.1-cp27-cp27m-manylinux1_i686.whl (143.0 kB view details)

Uploaded CPython 2.7m

pendulum-0.5.1-cp27-cp27m-macosx_10_11_x86_64.whl (110.1 kB view details)

Uploaded CPython 2.7mmacOS 10.11+ x86-64

File details

Details for the file pendulum-0.5.1.tar.gz.

File metadata

  • Download URL: pendulum-0.5.1.tar.gz
  • Upload date:
  • Size: 70.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for pendulum-0.5.1.tar.gz
Algorithm Hash digest
SHA256 59bdb2ef8e5f08c8c0544fc5a9295d90497e86d5b598de719995efbd138d8f8e
MD5 bcbac6f8f698d56b8fa793764fda0c85
BLAKE2b-256 0a254a72c49bf62957e56ad070553c526f8a8617f8b9da94eb900a95051d5062

See more details on using hashes here.

File details

Details for the file pendulum-0.5.1-cp35-cp35m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for pendulum-0.5.1-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 2becc6f723342c1bfa9d40d27052a80076228831f5f9ee1075bc3030586d7851
MD5 ccef715458de14311599dc9c449265e4
BLAKE2b-256 e9f5819c6ab71077680bdd0ae007731c806f90e46904874f59df99e9ab9a32f4

See more details on using hashes here.

File details

Details for the file pendulum-0.5.1-cp35-cp35m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for pendulum-0.5.1-cp35-cp35m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 7c83245dd464c4b09591db222984b4a52b667f4abc419a50c16d87e40fd5078f
MD5 c9fe668d0bfccb09243c3a37820c018d
BLAKE2b-256 c6f954e13aaadc8f82af8619448f16df0b236ebca7768923966cd031bad98b63

See more details on using hashes here.

File details

Details for the file pendulum-0.5.1-cp35-cp35m-macosx_10_11_x86_64.whl.

File metadata

File hashes

Hashes for pendulum-0.5.1-cp35-cp35m-macosx_10_11_x86_64.whl
Algorithm Hash digest
SHA256 fdeaa83794b6f78c97ca4d4b7bd23b799d51d1ea81b34e45ba82a6fd792eb7fb
MD5 af8a95a090bba56bc8f9524495e49ae6
BLAKE2b-256 29e33d0c9b6fa68c3eab9e10913159493f5d4b45838f2c0ff0e8b6abc09259a3

See more details on using hashes here.

File details

Details for the file pendulum-0.5.1-cp27-cp27m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for pendulum-0.5.1-cp27-cp27m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 782e93cced9439a7225345afb523557525fa3d2a21bf0a31cd1415da7ff336d0
MD5 c869be46f8581ba783fd0dde6da77ad3
BLAKE2b-256 b5abf41e4344c6272f3971185147f60b2121180d6304002ff894ea9e7ac50d52

See more details on using hashes here.

File details

Details for the file pendulum-0.5.1-cp27-cp27m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for pendulum-0.5.1-cp27-cp27m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 3729ef58c32dabc7075447cd9915a661eafcd004c2f24fb589fb1b7924d83d83
MD5 004da9149f489cdf2774da648d990c83
BLAKE2b-256 ff93b2ef10238f3243e63c96f4fbbf27e0636e415ba3791bdffb17ee7086c02b

See more details on using hashes here.

File details

Details for the file pendulum-0.5.1-cp27-cp27m-macosx_10_11_x86_64.whl.

File metadata

File hashes

Hashes for pendulum-0.5.1-cp27-cp27m-macosx_10_11_x86_64.whl
Algorithm Hash digest
SHA256 b55cadc4438254f5ef4da9a73abbd9fb6723731e275592bb0e0035fd8251210d
MD5 d577e0420483d5fd72e2bd8959b26784
BLAKE2b-256 037298e0600cb7ac6f09f2884d794ba3c09e26f5373a71a600dc7857998fa89d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page