Fast RFC3339 compliant Python date-time library

Overview

udatetime: Fast RFC3339 compliant date-time library

Handling date-times is a painful act because of the sheer endless amount of formats used by people. Luckily there are a couple of specified standards out there like ISO 8601. But even ISO 8601 leaves to many options on how to define date and time. That's why I encourage using the RFC3339 specified date-time format.

udatetime offers on average 76% faster datetime object instantiation, serialization and deserialization of RFC3339 date-time strings. udatetime is using Python's datetime class under the hood and code already using datetime should be able to easily switch to udatetime. All datetime objects created by udatetime are timezone-aware. The timezones that udatetime uses are fixed-offset timezones, meaning that they don't observe daylight savings time (DST), and thus return a fixed offset from UTC all year round.

Support Performance optimized Implementation
Python 2 ✔️ ✔️ C
Python 3 ✔️ ✔️ C
PyPy ✔️ ✔️ Pure Python
>>> udatetime.from_string("2016-07-15T12:33:20.123000+02:00")
datetime.datetime(2016, 7, 15, 12, 33, 20, 123000, tzinfo=+02:00)

>>> dt = udatetime.from_string("2016-07-15T12:33:20.123000+02:00")
>>> udatetime.to_string(dt)
'2016-07-15T12:33:20.123000+02:00'

>>> udatetime.now()
datetime.datetime(2016, 7, 29, 10, 15, 24, 472467, tzinfo=+02:00)

>>> udatetime.utcnow()
datetime.datetime(2016, 7, 29, 8, 15, 36, 184762, tzinfo=+00:00)

>>> udatetime.now_to_string()
'2016-07-29T10:15:46.641233+02:00'

>>> udatetime.utcnow_to_string()
'2016-07-29T08:15:56.129798+00:00'

>>> udatetime.to_string(udatetime.utcnow() - timedelta(hours=6))
'2016-07-29T02:16:05.770358+00:00'

>>> udatetime.fromtimestamp(time.time())
datetime.datetime(2016, 7, 30, 17, 45, 1, 536586, tzinfo=+02:00)

>>> udatetime.utcfromtimestamp(time.time())
datetime.datetime(2016, 8, 1, 10, 14, 53, tzinfo=+00:00)

Installation

Currently only POSIX compliant systems are supported. Working on cross-platform support.

$ pip install udatetime

You might need to install the header files of your Python installation and some essential tools to execute the build like a C compiler.

Python 2

$ sudo apt-get install python-dev build-essential

or

$ sudo yum install python-devel gcc

Python 3

$ sudo apt-get install python3-dev build-essential

or

$ sudo yum install python3-devel gcc

Benchmark

The benchmarks compare the performance of equivalent code of datetime and udatetime. The benchmark measures the time needed for 1 million executions and takes the min of 3 repeats. You can run the benchmark yourself and see the results on your machine by executing the bench_udatetime.py script.

Benchmark interpreter summary

Python 2.7

$ python scripts/bench_udatetime.py
Executing benchmarks ...

============ benchmark_parse
datetime_strptime 10.6306970119
udatetime_parse 1.109801054
udatetime is 9.6 times faster

============ benchmark_format
datetime_strftime 2.08363199234
udatetime_format 0.654432058334
udatetime is 3.2 times faster

============ benchmark_utcnow
datetime_utcnow 0.485884904861
udatetime_utcnow 0.237742185593
udatetime is 2.0 times faster

============ benchmark_now
datetime_now 1.37059998512
udatetime_now 0.235424041748
udatetime is 5.8 times faster

============ benchmark_utcnow_to_string
datetime_utcnow_to_string 2.56599593163
udatetime_utcnow_to_string 0.685483932495
udatetime is 3.7 times faster

============ benchmark_now_to_string
datetime_now_to_string 3.68989396095
udatetime_now_to_string 0.687911987305
udatetime is 5.4 times faster

============ benchmark_fromtimestamp
datetime_fromtimestamp 1.38640713692
udatetime_fromtimestamp 0.287910938263
udatetime is 4.8 times faster

============ benchmark_utcfromtimestamp
datetime_utcfromtimestamp 0.533131837845
udatetime_utcfromtimestamp 0.279694080353
udatetime is 1.9 times faster

Python 3.5

$ python scripts/bench_udatetime.py
Executing benchmarks ...

============ benchmark_parse
datetime_strptime 9.90670353400003
udatetime_parse 1.1668808249999074
udatetime is 8.5 times faster

============ benchmark_format
datetime_strftime 3.0286041580000074
udatetime_format 0.7153575119999687
udatetime is 4.2 times faster

============ benchmark_utcnow
datetime_utcnow 0.5638177430000724
udatetime_utcnow 0.2548112540000602
udatetime is 2.2 times faster

============ benchmark_now
datetime_now 1.457822759999999
udatetime_now 0.26195338699994863
udatetime is 5.6 times faster

============ benchmark_utcnow_to_string
datetime_utcnow_to_string 3.5347913849999486
udatetime_utcnow_to_string 0.750341161999927
udatetime is 4.7 times faster

============ benchmark_now_to_string
datetime_now_to_string 4.854975383999999
udatetime_now_to_string 0.7411948169999505
udatetime is 6.6 times faster

============ benchmark_fromtimestamp
datetime_fromtimestamp 1.4233373309999706
udatetime_fromtimestamp 0.31758270299997093
udatetime is 4.5 times faster

============ benchmark_utcfromtimestamp
datetime_utcfromtimestamp 0.5633522409999614
udatetime_utcfromtimestamp 0.305099536000057
udatetime is 1.8 times faster

PyPy 5.3.1

$ python scripts/bench_udatetime.py
Executing benchmarks ...

============ benchmark_parse
datetime_strptime 2.31050491333
udatetime_parse 0.838973045349
udatetime is 2.8 times faster

============ benchmark_format
datetime_strftime 0.957178115845
udatetime_format 0.162060976028
udatetime is 5.9 times faster

============ benchmark_utcnow
datetime_utcnow 0.149839878082
udatetime_utcnow 0.149217844009
udatetime is as fast as datetime

============ benchmark_now
datetime_now 0.967023134232
udatetime_now 0.15003991127
udatetime is 6.4 times faster

============ benchmark_utcnow_to_string
datetime_utcnow_to_string 1.24988698959
udatetime_utcnow_to_string 0.632546901703
udatetime is 2.0 times faster

============ benchmark_now_to_string
datetime_now_to_string 2.13041496277
udatetime_now_to_string 0.607964038849
udatetime is 3.5 times faster

============ benchmark_fromtimestamp
datetime_fromtimestamp 0.903736114502
udatetime_fromtimestamp 0.0907990932465
udatetime is 10.0 times faster

============ benchmark_utcfromtimestamp
datetime_utcfromtimestamp 0.0890419483185
udatetime_utcfromtimestamp 0.0907027721405
udatetime is as fast as datetime

Why RFC3339

The RFC3339 specification has the following advantages:

  • Defined date, time, timezone, date-time format
  • 4 digit year
  • Fractional seconds
  • Human readable
  • No redundant information like weekday name
  • Simple specification, easily machine readable

RFC3339 format specification

date-fullyear   = 4DIGIT
date-month      = 2DIGIT  ; 01-12
date-mday       = 2DIGIT  ; 01-28, 01-29, 01-30, 01-31 based on
                          ; month/year
time-hour       = 2DIGIT  ; 00-23
time-minute     = 2DIGIT  ; 00-59
time-second     = 2DIGIT  ; 00-58, 00-59, 00-60 based on leap second
                          ; rules
time-secfrac    = "." 1*DIGIT
time-numoffset  = ("+" / "-") time-hour ":" time-minute
time-offset     = "Z" / time-numoffset

partial-time    = time-hour ":" time-minute ":" time-second [time-secfrac]

full-date       = date-fullyear "-" date-month "-" date-mday
full-time       = partial-time time-offset

date-time       = full-date "T" full-time

udatetime specific format addons:

  • time-secfrac from 1DIGIT up to 6DIGIT
  • time-secfrac will be normalized to microseconds
  • time-offset is optional. Missing time-offset will be treated as UTC.
  • spaces will be eliminated

Why in C?

The Python datetime library is flexible but painfully slow, when it comes to parsing and formating. High performance applications like web services or logging benefit from fast underlying libraries. Restricting the input format to one standard allows for optimization and results in speed improvements.

Comments
  • error: command 'gcc' failed with exit status 1

    error: command 'gcc' failed with exit status 1

    I tried to install this on CentOS 7 and got this error:

    ; pip install udatetime
    Collecting udatetime
      Using cached udatetime-0.0.2.tar.gz
    Building wheels for collected packages: udatetime
      Running setup.py bdist_wheel for udatetime ... error
      Complete output from command /home/usr/.virtualenvs/mead/bin/python -u -c "im
    port setuptools, tokenize;__file__='/tmp/pip-build-1v_otE/udatetime/setup.py';ex
    ec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'
    ), __file__, 'exec'))" bdist_wheel -d /tmp/tmpxo1peqpip-wheel- --python-tag cp27
    :
      running bdist_wheel
      running build
      running build_py
      creating build
      creating build/lib.linux-x86_64-2.7
      creating build/lib.linux-x86_64-2.7/udatetime
      copying udatetime/__init__.py -> build/lib.linux-x86_64-2.7/udatetime
      running egg_info
      writing udatetime.egg-info/PKG-INFO
      writing top-level names to udatetime.egg-info/top_level.txt
      writing dependency_links to udatetime.egg-info/dependency_links.txt
      warning: manifest_maker: standard file '-c' not found
    
      reading manifest file 'udatetime.egg-info/SOURCES.txt'
      reading manifest template 'MANIFEST.in'
      writing manifest file 'udatetime.egg-info/SOURCES.txt'
      running build_ext
      building 'rfc3339' extension
      creating build/temp.linux-x86_64-2.7
      creating build/temp.linux-x86_64-2.7/src
      gcc -pthread -fno-strict-aliasing -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -
    fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-swit
    ches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -DNDEBUG -O2 -g -pipe -Wall
     -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffe
    r-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -
    fPIC -I/usr/include/python2.7 -c ./src/rfc3339.c -o build/temp.linux-x86_64-2.7/
    ./src/rfc3339.o -Ofast
      In file included from /usr/include/python2.7/pyconfig.h:6:0,
                       from /usr/include/python2.7/Python.h:8,
                       from ./src/rfc3339.c:8:
      /usr/include/python2.7/pyconfig-64.h:1182:0: warning: "_POSIX_C_SOURCE" redefi
    ned [enabled by default]
       #define _POSIX_C_SOURCE 200112L
       ^
      In file included from /usr/include/math.h:27:0,
                       from ./src/rfc3339.c:1:
      /usr/include/features.h:168:0: note: this is the location of the previous defi
    nition
       # define _POSIX_C_SOURCE 200809L
       ^
      In file included from /usr/include/python2.7/pyconfig.h:6:0,
                       from /usr/include/python2.7/Python.h:8,
                       from ./src/rfc3339.c:8:
      /usr/include/python2.7/pyconfig-64.h:1204:0: warning: "_XOPEN_SOURCE" redefine
    d [enabled by default]
       #define _XOPEN_SOURCE 600
       ^
      In file included from /usr/include/math.h:27:0,
                       from ./src/rfc3339.c:1:
      /usr/include/features.h:170:0: note: this is the location of the previous defi
    nition
       # define _XOPEN_SOURCE 700
       ^
      ./src/rfc3339.c: In function ‘_parse_time’:
      ./src/rfc3339.c:250:9: error: ‘for’ loop initial declarations are only allowed
     in C99 mode
               for (unsigned int i = 0; i < 6; i++) {
               ^
      ./src/rfc3339.c:250:9: note: use option -std=c99 or -std=gnu99 to compile your
     code
      error: command 'gcc' failed with exit status 1
    
    
    opened by kierun 5
  • Cannot build on Python 3.9

    Cannot build on Python 3.9

    pip install udatetime fails to compile udatetime on Python 3.9. Works fine on 3.8.

    Tested on:

    • Python 3.9.0 on Ubuntu in Windows Subsystem for Linux on Windows 10
    • Python 3.9.0 on Darwin 19.6.0 (MacBook)

    Fails with similar errors on both.


    Stacktrace for Ubuntu in WSL
    $ env39_wsl/bin/pip install udatetime
    Collecting udatetime
      Downloading udatetime-0.0.16.tar.gz (13 kB)
    Using legacy 'setup.py install' for udatetime, since package 'wheel' is not installed.
    Installing collected packages: udatetime
        Running setup.py install for udatetime ... error
        ERROR: Command errored out with exit status 1:
         command: /mnt/c/Users/<redacted>/env39_wsl/bin/python3.9 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-1qm3faee/udatetime/setup.py'"'"'; __file__='"'"'/tmp/pip-install-1qm3faee/udatetime/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-lkuefh40/install-record.txt --single-version-externally-managed --compile --install-headers /mnt/c/Users/<redacted>/env39_wsl/include/site/python3.9/udatetime
             cwd: /tmp/pip-install-1qm3faee/udatetime/
        Complete output (36 lines):
        running install
        running build
        running build_py
        creating build
        creating build/lib.linux-x86_64-3.9
        creating build/lib.linux-x86_64-3.9/udatetime
        copying udatetime/__init__.py -> build/lib.linux-x86_64-3.9/udatetime
        copying udatetime/_pure.py -> build/lib.linux-x86_64-3.9/udatetime
        running egg_info
        writing udatetime.egg-info/PKG-INFO
        writing dependency_links to udatetime.egg-info/dependency_links.txt
        writing top-level names to udatetime.egg-info/top_level.txt
        reading manifest file 'udatetime.egg-info/SOURCES.txt'
        reading manifest template 'MANIFEST.in'
        writing manifest file 'udatetime.egg-info/SOURCES.txt'
        running build_ext
        building 'udatetime.rfc3339' extension
        creating build/temp.linux-x86_64-3.9
        creating build/temp.linux-x86_64-3.9/src
        x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security
     -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -D_PYTHON3=1 -I/mnt/c/Users/<redacted>/env39_wsl/include -I/usr/
    include/python3.9 -c ./src/rfc3339.c -o build/temp.linux-x86_64-3.9/./src/rfc3339.o -Ofast -std=c99
        ./src/rfc3339.c: In function ‘_gettime’:
        ./src/rfc3339.c:100:18: error: storage size of ‘t’ isn’t known
             struct timeb t;
                          ^
        ./src/rfc3339.c:101:5: warning: implicit declaration of function ‘ftime’; did you mean ‘stime’? [-Wimplicit-function-declaration]
             ftime(&t);
             ^~~~~
             stime
        ./src/rfc3339.c:100:18: warning: unused variable ‘t’ [-Wunused-variable]
             struct timeb t;
                          ^
        ./src/rfc3339.c: At top level:
        ./src/rfc3339.c:516:21: warning: ‘CAPI’ initialized and declared ‘extern’
         extern RFC3999_CAPI CAPI = {
                             ^~~~
        error: command '/usr/bin/x86_64-linux-gnu-gcc' failed with exit code 1
        ----------------------------------------
    ERROR: Command errored out with exit status 1: /mnt/c/Users/<redacted>/env39_wsl/bin/python3.9 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-1qm3faee/udatetime/setup.py'"'"'; __file__='"'"'/tmp/pip-install-1qm3faee/udatetime/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-lkuefh40/install-record.txt --single-version-externally-managed --compile --install-headers /mnt/c/Users/<redacted>/env39_wsl/include/site/python3.9/udatetime Check the logs for full command output.
    
    Stacktrace for Darwin (MacBook) ``` Building wheels for collected packages: udatetime Building wheel for udatetime (setup.py): started Building wheel for udatetime (setup.py): finished with status 'error' ERROR: Command errored out with exit status 1: command: /Users/michael.overmeyer/src/github.com/closeio/ciso8601/benchmarking/.tox/py39/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/f5/5752mxwn72j_xmm44mc5xt900000gn/T/pip-install-sjrwiw8m/udatetime/setup.py'"'"'; __file__='"'"'/private/var/folders/f5/5752mxwn72j_xmm44mc5xt900000gn/T/pip-install-sjrwiw8m/udatetime/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /private/var/folders/f5/5752mxwn72j_xmm44mc5xt900000gn/T/pip-wheel-ar7o0x3d cwd: /private/var/folders/f5/5752mxwn72j_xmm44mc5xt900000gn/T/pip-install-sjrwiw8m/udatetime/ Complete output (34 lines): running bdist_wheel running build running build_py creating build creating build/lib.macosx-10.9-x86_64-3.9 creating build/lib.macosx-10.9-x86_64-3.9/udatetime copying udatetime/__init__.py -> build/lib.macosx-10.9-x86_64-3.9/udatetime copying udatetime/_pure.py -> build/lib.macosx-10.9-x86_64-3.9/udatetime running egg_info writing udatetime.egg-info/PKG-INFO writing dependency_links to udatetime.egg-info/dependency_links.txt writing top-level names to udatetime.egg-info/top_level.txt reading manifest file 'udatetime.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' writing manifest file 'udatetime.egg-info/SOURCES.txt' running build_ext building 'udatetime.rfc3339' extension creating build/temp.macosx-10.9-x86_64-3.9 creating build/temp.macosx-10.9-x86_64-3.9/src gcc -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -arch x86_64 -g -D_PYTHON3=1 -I/Users/michael.overmeyer/src/github.com/closeio/ciso8601/benchmarking/.tox/py39/include -I/Library/Frameworks/Python.framework/Versions/3.9/include/python3.9 -c ./src/rfc3339.c -o build/temp.macosx-10.9-x86_64-3.9/./src/rfc3339.o -Ofast -std=c99 ./src/rfc3339.c:100:18: error: variable has incomplete type 'struct timeb' struct timeb t; ^ ./src/rfc3339.c:100:12: note: forward declaration of 'struct timeb' struct timeb t; ^ ./src/rfc3339.c:101:5: error: implicit declaration of function 'ftime' is invalid in C99 [-Werror,-Wimplicit-function-declaration] ftime(&t); ^ ./src/rfc3339.c:516:21: warning: 'extern' variable has an initializer [-Wextern-initializer] extern RFC3999_CAPI CAPI = { ^ 1 warning and 2 errors generated. error: command '/usr/bin/gcc' failed with exit code 1 ---------------------------------------- ERROR: Failed building wheel for udatetime Running setup.py clean for udatetime Failed to build udatetime Installing collected packages: aniso8601, six, python-dateutil, arrow, iso8601, monthdelta, enum34, iso8601utils, isodate, pytz, tzlocal, regex, dateparser, humanize, snaptime, pytzdata, pendulum, maya, times, moment, pyso8601, str2date, udatetime, pytimeparse, Babel, zulu, chardet, mbstrdecoder, typepy, msgfy, tcolorpy, DataProperty, pathvalidate, tabledata, pytablewriter, toml, filelock, appdirs, distlib, virtualenv, py, pluggy, pyparsing, packaging, tox Running setup.py install for udatetime: started Running setup.py install for udatetime: finished with status 'error' ERROR: Command errored out with exit status 1: command: /Users/michael.overmeyer/src/github.com/closeio/ciso8601/benchmarking/.tox/py39/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/f5/5752mxwn72j_xmm44mc5xt900000gn/T/pip-install-sjrwiw8m/udatetime/setup.py'"'"'; __file__='"'"'/private/var/folders/f5/5752mxwn72j_xmm44mc5xt900000gn/T/pip-install-sjrwiw8m/udatetime/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/f5/5752mxwn72j_xmm44mc5xt900000gn/T/pip-record-ooxk6ok5/install-record.txt --single-version-externally-managed --compile --install-headers /Users/michael.overmeyer/src/github.com/closeio/ciso8601/benchmarking/.tox/py39/include/site/python3.9/udatetime cwd: /private/var/folders/f5/5752mxwn72j_xmm44mc5xt900000gn/T/pip-install-sjrwiw8m/udatetime/ Complete output (34 lines): running install running build running build_py creating build creating build/lib.macosx-10.9-x86_64-3.9 creating build/lib.macosx-10.9-x86_64-3.9/udatetime copying udatetime/__init__.py -> build/lib.macosx-10.9-x86_64-3.9/udatetime copying udatetime/_pure.py -> build/lib.macosx-10.9-x86_64-3.9/udatetime running egg_info writing udatetime.egg-info/PKG-INFO writing dependency_links to udatetime.egg-info/dependency_links.txt writing top-level names to udatetime.egg-info/top_level.txt reading manifest file 'udatetime.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' writing manifest file 'udatetime.egg-info/SOURCES.txt' running build_ext building 'udatetime.rfc3339' extension creating build/temp.macosx-10.9-x86_64-3.9 creating build/temp.macosx-10.9-x86_64-3.9/src gcc -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -arch x86_64 -g -D_PYTHON3=1 -I/Users/michael.overmeyer/src/github.com/closeio/ciso8601/benchmarking/.tox/py39/include -I/Library/Frameworks/Python.framework/Versions/3.9/include/python3.9 -c ./src/rfc3339.c -o build/temp.macosx-10.9-x86_64-3.9/./src/rfc3339.o -Ofast -std=c99 ./src/rfc3339.c:100:18: error: variable has incomplete type 'struct timeb' struct timeb t; ^ ./src/rfc3339.c:100:12: note: forward declaration of 'struct timeb' struct timeb t; ^ ./src/rfc3339.c:101:5: error: implicit declaration of function 'ftime' is invalid in C99 [-Werror,-Wimplicit-function-declaration] ftime(&t); ^ ./src/rfc3339.c:516:21: warning: 'extern' variable has an initializer [-Wextern-initializer] extern RFC3999_CAPI CAPI = { ^ 1 warning and 2 errors generated. error: command '/usr/bin/gcc' failed with exit code 1 ---------------------------------------- ERROR: Command errored out with exit status 1: /Users/michael.overmeyer/src/github.com/closeio/ciso8601/benchmarking/.tox/py39/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/f5/5752mxwn72j_xmm44mc5xt900000gn/T/pip-install-sjrwiw8m/udatetime/setup.py'"'"'; __file__='"'"'/private/var/folders/f5/5752mxwn72j_xmm44mc5xt900000gn/T/pip-install-sjrwiw8m/udatetime/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/f5/5752mxwn72j_xmm44mc5xt900000gn/T/pip-record-ooxk6ok5/install-record.txt --single-version-externally-managed --compile --install-headers /Users/michael.overmeyer/src/github.com/closeio/ciso8601/benchmarking/.tox/py39/include/site/python3.9/udatetime Check the logs for full command output. ```
    opened by movermeyer 4
  • Consider moving rfc3339 module under udatetime

    Consider moving rfc3339 module under udatetime

    Hi!

    The udatetime package installs the rfc3339 module at the top-level, effectively shadowing the rfc3339 Python package. Do you think it is possible to move the rfc3339 module under udatetime?

    opened by iliastsi 3
  • Segmentation fault when i run utcnow frequently

    Segmentation fault when i run utcnow frequently

    I use ipython's timeit to benchmark udatetime like:

    %timeit -n 1000000 -r 10 udatetime.utcnow()

    when i repeat this command 5 times, it block serveral seconds and print : Segmentation fault (core dumped)

    datetime library is ok

    opened by xiewenlongs 3
  • Memory leak in from_string

    Memory leak in from_string

    udatetime version 0.13 leaks memory when calling from_string.

    Example (Python 2.7):

    import udatetime
    
    s = u"2008-09-08T22:47:31-07:00"
    while True:
        t = udatetime.from_string(s)
    

    The pure python version of from_string does not leak, only the C-extension (from_rfc3339_string) does.

    opened by ldanielburr 2
  • Memory leak

    Memory leak

    Please check using i.e. htop:

    #!/usr/bin/python3

    -- coding:utf8 --

    import udatetime while True: udatetime.now()

    It eats megabytes in seconds. I use your library, beacause it's very fast - but this problem was pretty hard to find.

    Sincerely Gregory

    bug 
    opened by gregers666 2
  • Support for variable length fraction seconds

    Support for variable length fraction seconds

    Currently only 3 and 6 digit fraction seconds are supported:

    time-secfrac can be either 3DIGIT for milliseconds or 6DIGIT for microseconds

    So 2 digit ones fail:

    In [1]: import udatetime
    
    In [2]: udatetime.from_string("2016-07-15T12:33:20.123000+02:00")
    Out[2]: datetime.datetime(2016, 7, 15, 12, 33, 20, 123000, tzinfo=+02:00)
    
    In [3]: udatetime.from_string("2016-07-15T12:33:20.123000Z")
    Out[3]: datetime.datetime(2016, 7, 15, 12, 33, 20, 123000, tzinfo=+00:00)
    
    In [4]: udatetime.from_string("2016-07-15T12:33:20.12Z")
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    <ipython-input-4-240aac401a4c> in <module>()
    ----> 1 udatetime.from_string("2016-07-15T12:33:20.12Z")
    
    ValueError: Invalid RFC3339 date-time string. Time invalid.
    

    I don't control data source so to use udatetime I would need to do string conversion which might eat all performance benefits. Would it be possible to support any fraction seconds up to 6 digits?

    opened by prymitive 2
  • Timestamp conversion does not handle daylight time

    Timestamp conversion does not handle daylight time

    It looks like udatetime does not handle changing utc offset for daylight savings time at different times of year, so the unit tests that use local timezone are failing when run in US Eastern Timezone.

    Here is the problem: https://github.com/freach/udatetime/blob/master/src/rfc3339.c#L74 udatetime uses the same UTC offset (in my case -4) for all dates, but datetime correctly uses -5 in January and -4 in August

    In[2]: import udatetime
    In[3]: from datetime import datetime
    
    In[4]: udatetime.fromtimestamp(1471046400)
    Out[4]: datetime.datetime(2016, 8, 12, 20, 0, tzinfo=--4:00)
    In[5]: datetime.fromtimestamp(1471046400)
    Out[5]: datetime.datetime(2016, 8, 12, 20, 0)
    
    In[6]: udatetime.fromtimestamp(1451606400)
    Out[6]: datetime.datetime(2015, 12, 31, 20, 0, tzinfo=--4:00)
    In[7]: datetime.fromtimestamp(1451606400)
    Out[7]: datetime.datetime(2015, 12, 31, 19, 0)
    
    In[8]: udatetime.fromtimestamp(0)
    Out[8]: datetime.datetime(1969, 12, 31, 20, 0, tzinfo=--4:00)
    In[9]: datetime.fromtimestamp(0)
    Out[9]: datetime.datetime(1969, 12, 31, 19, 0)
    
    

    Recommend changing the unit tests to avoid this problem buy using utcfromtimestamp() in the tests that do not supply a timestamp.

    In future, consider avoiding the problem entirely by always assuming that any datetime that does not come with an explicit timezone offset is UTC and never use the local timezone implicitly. Since this library is all about high performance for high volume throughput, it seems likely that most use cases will be using UTC anyway.

    bug 
    opened by pwoods25443 2
  • Explicitly include <sys/timeb.h> for ftime() and struct timeb

    Explicitly include for ftime() and struct timeb

    Needed to build on Python 3.9.

    Fixes: #32

    Can't see what changed in the Python 3.9 headers, where this used to be transitively included and isn't any more.

    Note, ftime() is deprecated, and should be replaced with gettimeofday(). This PR does not do that.

    opened by stefanor 1
  • Shared library is not properly linked with libm

    Shared library is not properly linked with libm

    udatetime uses the pow() math function in src/rfc3339.c, but doesn't link with libm.so.

    This was reported on Debian issue #954305, which also contains a possible fix.

    opened by iliastsi 1
  • Timestamp generation

    Timestamp generation

    It would be nice to have some faster timestamp generation that one get from pure datetime.timestamp() or time.time(). It can be very useful for any logging, etc. in case of fast application (like load testing using locust.io)

    opened by mkusz 1
  • datetimes cannot be pickled: attribute lookup FixedOffset_type on rfc3339 failed

    datetimes cannot be pickled: attribute lookup FixedOffset_type on rfc3339 failed

    When you try to pickle a datetime object, you get this error:

    >>> import udatetime
    >>> import pickle
    >>> d = udatetime.now()
    >>> pickle.dumps(d)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    _pickle.PicklingError: Can't pickle <class 'rfc3339.FixedOffset_type'>: attribute lookup FixedOffset_type on rfc3339 failed
    
    opened by federicoemartinez 0
  • rfc3339.FixedOffset_type is not copyable

    rfc3339.FixedOffset_type is not copyable

    Cannot use copy.deepcopy for datetime objects created with udatetime as deepcopy fails for rfc3339.FixedOffset_type. Example:

    >>> import udatetime
    >>> import datetime
    >>> import pytz
    >>> from copy import deepcopy
    >>> dtu = udatetime.now()
    >>> # deepcopy fails
    ... deepcopy(dtu)
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
      File "/usr/local/lib/python3.7/copy.py", line 180, in deepcopy
        y = _reconstruct(x, memo, *rv)
      File "/usr/local/lib/python3.7/copy.py", line 274, in _reconstruct
        y = func(*args)
      File "/usr/local/lib/python3.7/copy.py", line 273, in <genexpr>
        args = (deepcopy(arg, memo) for arg in args)
      File "/usr/local/lib/python3.7/copy.py", line 180, in deepcopy
        y = _reconstruct(x, memo, *rv)
      File "/usr/local/lib/python3.7/copy.py", line 274, in _reconstruct
        y = func(*args)
    TypeError: function takes exactly 1 argument (0 given)
    >>> deepcopy(dtu.tzinfo)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/local/lib/python3.7/copy.py", line 180, in deepcopy
        y = _reconstruct(x, memo, *rv)
      File "/usr/local/lib/python3.7/copy.py", line 274, in _reconstruct
        y = func(*args)
    TypeError: function takes exactly 1 argument (0 given)
    >>> # compared to e.g. pytz as tzinfo
    ... tz = pytz.timezone('Europe/Helsinki')
    >>> dt = tz.localize(dtu.replace(tzinfo=None))
    >>> deepcopy(dt)
    datetime.datetime(2018, 7, 6, 19, 0, 32, 153444, tzinfo=<DstTzInfo 'Europe/Helsinki' EEST+3:00:00 DST>)
    

    Using e.g. pytz as tzinfo works fine. Using: Python 3.7.0 udatetime 0.0.16

    opened by Nipsuli 1
  • Support to rfc3339 Durations and Periods

    Support to rfc3339 Durations and Periods

    Durations:
    
       dur-second        = 1*DIGIT "S"
       dur-minute        = 1*DIGIT "M" [dur-second]
       dur-hour          = 1*DIGIT "H" [dur-minute]
       dur-time          = "T" (dur-hour / dur-minute / dur-second)
       dur-day           = 1*DIGIT "D"
       dur-week          = 1*DIGIT "W"
       dur-month         = 1*DIGIT "M" [dur-day]
       dur-year          = 1*DIGIT "Y" [dur-month]
       dur-date          = (dur-day / dur-month / dur-year) [dur-time]
    
       duration          = "P" (dur-date / dur-time / dur-week)
    
    
    
    Klyne, et. al.              Standards Track                    [Page 13]
    
    RFC 3339       Date and Time on the Internet: Timestamps       July 2002
    
    
    Periods:
    
       period-explicit   = iso-date-time "/" iso-date-time
       period-start      = iso-date-time "/" duration
       period-end        = duration "/" iso-date-time
    
       period            = period-explicit / period-start / period-end
    
    opened by gustavorps 0
  • Fix POSIX only support for _get_local_utc_offset()

    Fix POSIX only support for _get_local_utc_offset()

    The usage of the "tm_gmtoff" field in tm struct (src/rfc3339.c) is currently only supported by POSIX systems. For cross-platform compatibility fallbacks should be offered.

    opened by freach 1
Releases(0.0.17)
  • 0.0.17(Aug 12, 2022)

    Release tested on Python 2.7, Python 3.5 and Python 3.9.

    • Link shared library with libm #30
    • Explicitly include <sys/timeb.h> for ftime() and struct timeb
    • remove tz offset calculation on UTC timestamp
    Source code(tar.gz)
    Source code(zip)
  • 0.0.16(Feb 14, 2018)

  • 0.0.15(Feb 8, 2018)

  • 0.0.14(Dec 4, 2017)

    • Fix documentation to point out a minor issue with udatetime's timezones
    • Fix DST information, return proper DST information

    Thanks to @apyrgio

    Source code(tar.gz)
    Source code(zip)
  • 0.0.13(Aug 7, 2017)

Owner
Simon Pirschel
DevOps Specialist - Hire me for consultancy
Simon Pirschel
Syntax-Aware Action Targeting for Video Captioning

Syntax-Aware Action Targeting for Video Captioning Code for SAAT from "Syntax-Aware Action Targeting for Video Captioning" (Accepted to CVPR 2020). Th

59 Oct 13, 2022
The tl;dr on a few notable transformer/language model papers + other papers (alignment, memorization, etc).

The tl;dr on a few notable transformer/language model papers + other papers (alignment, memorization, etc).

Will Thompson 166 Jan 04, 2023
VR Viewport Pose Model for Quantifying and Exploiting Frame Correlations

This repository contains the introduction to the collected VRViewportPose dataset and the code for the IEEE INFOCOM 2022 paper: "VR Viewport Pose Model for Quantifying and Exploiting Frame Correlatio

0 Aug 10, 2022
Download and preprocess popular sequential recommendation datasets

Sequential Recommendation Datasets This repository collects some commonly used sequential recommendation datasets in recent research papers and provid

125 Dec 06, 2022
A PyTorch re-implementation of Neural Radiance Fields

nerf-pytorch A PyTorch re-implementation Project | Video | Paper NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis Ben Mildenhall

Krishna Murthy 709 Jan 09, 2023
Evidential Softmax for Sparse Multimodal Distributions in Deep Generative Models

Evidential Softmax for Sparse Multimodal Distributions in Deep Generative Models Abstract Many applications of generative models rely on the marginali

Stanford Intelligent Systems Laboratory 9 Jun 06, 2022
B-cos Networks: Attention is All we Need for Interpretability

Convolutional Dynamic Alignment Networks for Interpretable Classifications M. Böhle, M. Fritz, B. Schiele. B-cos Networks: Alignment is All we Need fo

58 Dec 23, 2022
Repository for the electrical and ICT benchmark model developed in the ERIGrid 2.0 project.

Benchmark Model Electrical and ICT System This repository contains the documentation, code, and models for the electrical and ICT benchmark model deve

ERIGrid 2.0 1 Nov 29, 2021
A MNIST-like fashion product database. Benchmark

Fashion-MNIST Table of Contents Why we made Fashion-MNIST Get the Data Usage Benchmark Visualization Contributing Contact Citing Fashion-MNIST License

Zalando Research 10.5k Jan 08, 2023
Rewrite ultralytics/yolov5 v6.0 opencv inference code based on numpy, no need to rely on pytorch

Rewrite ultralytics/yolov5 v6.0 opencv inference code based on numpy, no need to rely on pytorch; pre-processing and post-processing using numpy instead of pytroch.

炼丹去了 21 Dec 12, 2022
Dist2Dec: A Simplicial Neural Network for Homology Localization

Dist2Dec: A Simplicial Neural Network for Homology Localization

Alexandros Keros 6 Jun 12, 2022
Official codebase for Decision Transformer: Reinforcement Learning via Sequence Modeling.

Decision Transformer Lili Chen*, Kevin Lu*, Aravind Rajeswaran, Kimin Lee, Aditya Grover, Michael Laskin, Pieter Abbeel, Aravind Srinivas†, and Igor M

Kevin Lu 1.4k Jan 07, 2023
DIR-GNN - Discovering Invariant Rationales for Graph Neural Networks

DIR-GNN "Discovering Invariant Rationales for Graph Neural Networks" (ICLR 2022)

Ying-Xin (Shirley) Wu 70 Nov 13, 2022
This repository provides a basic implementation of our GCPR 2021 paper "Learning Conditional Invariance through Cycle Consistency"

Learning Conditional Invariance through Cycle Consistency This repository provides a basic TensorFlow 1 implementation of the proposed model in our GC

BMDA - University of Basel 1 Nov 04, 2022
Multi-view 3D reconstruction using neural rendering. Unofficial implementation of UNISURF, VolSDF, NeuS and more.

Volume rendering + 3D implicit surface Showcase What? previous: surface rendering; now: volume rendering previous: NeRF's volume density; now: implici

Jianfei Guo 682 Jan 04, 2023
🚀 PyTorch Implementation of "Progressive Distillation for Fast Sampling of Diffusion Models(v-diffusion)"

PyTorch Implementation of "Progressive Distillation for Fast Sampling of Diffusion Models(v-diffusion)" Unofficial PyTorch Implementation of Progressi

Vitaliy Hramchenko 58 Dec 19, 2022
Ego4d dataset repository. Download the dataset, visualize, extract features & example usage of the dataset

Ego4D EGO4D is the world's largest egocentric (first person) video ML dataset and benchmark suite, with 3,600 hrs (and counting) of densely narrated v

Meta Research 118 Jan 07, 2023
Finite-temperature variational Monte Carlo calculation of uniform electron gas using neural canonical transformation.

CoulombGas This code implements the neural canonical transformation approach to the thermodynamic properties of uniform electron gas. Building on JAX,

FermiFlow 9 Mar 03, 2022
High performance distributed framework for training deep learning recommendation models based on PyTorch.

High performance distributed framework for training deep learning recommendation models based on PyTorch.

340 Dec 30, 2022
An open source Jetson Nano baseboard and tools to design your own.

My Jetson Nano Baseboard This basic baseboard gives the user the foundation and the flexibility to design their own baseboard for the Jetson Nano. It

NVIDIA AI IOT 57 Dec 29, 2022