用于在aniso8601中使用numpy datetime api的库
numpytimebuilder的Python项目详细描述
numpytimebuilder
aniso8601用于numpy日期时间的生成器
功能
- 提供与aniso8601 兼容的
- 返回
datetime64
和timedelta64
NumPy types
NumPyTimeBuilder
安装
建议的安装方法是使用pip:
$ pip install numpytimebuilder
或者,您可以下载源代码(托管在Bitbucket的git存储库)并直接安装:
$ python setup.py install
使用
分析日期时间
要分析典型的ISO 8601日期时间字符串:
>>> import aniso8601 >>> from numpytimebuilder import NumPyTimeBuilder >>> aniso8601.parse_datetime('1977-06-10T12:00:00', builder=NumPyTimeBuilder) numpy.datetime64('1977-06-10T12:00:00')
可以指定替代分隔符,例如空格:
>>> aniso8601.parse_datetime('1977-06-10 12:00:00', delimiter=' ', builder=NumPyTimeBuilder) numpy.datetime64('1977-06-10T12:00:00')
由于numpy datetime64
实现仅支持原始日期时间,因此显式不支持时区:
>>> aniso8601.parse_datetime('1977-06-10T12:00:00Z', builder=NumPyTimeBuilder) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/nielsenb/Jetfuse/numpytimebuilder/python2/lib/python2.7/site-packages/aniso8601/time.py", line 131, in parse_datetime return builder.build_datetime(datepart, timepart) File "numpytimebuilder/__init__.py", line 37, in build_datetime raise NotImplementedError('Timezones are not supported by numpy ' NotImplementedError: Timezones are not supported by numpy datetime64 type. >>> aniso8601.parse_datetime('1979-06-05T08:00:00-08:00', builder=NumPyTimeBuilder) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/nielsenb/Jetfuse/numpytimebuilder/python2/lib/python2.7/site-packages/aniso8601/time.py", line 131, in parse_datetime return builder.build_datetime(datepart, timepart) File "numpytimebuilder/__init__.py", line 37, in build_datetime raise NotImplementedError('Timezones are not supported by numpy ' NotImplementedError: Timezones are not supported by numpy datetime64 type
numpydatetime64
实现当前不支持闰秒,因此显式不支持闰秒:
>>> aniso8601.parse_datetime('2018-03-06T23:59:60', builder=NumPyTimeBuilder) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/nielsenb/Jetfuse/numpytimebuilder/python2/lib/python2.7/site-packages/aniso8601/time.py", line 131, in parse_datetime return builder.build_datetime(datepart, timepart) File "numpytimebuilder/__init__.py", line 120, in build_datetime raise LeapSecondError('Leap seconds are not supported.') aniso8601.exceptions.LeapSecondError: Leap seconds are not supported.
分析日期
解析iso 8601字符串中表示的日期:
>>> import aniso8601 >>> from numpytimebuilder import NumPyTimeBuilder >>> aniso8601.parse_date('1984-04-23', builder=NumPyTimeBuilder) numpy.datetime64('1984-04-23')
也支持基本格式:
>>> aniso8601.parse_date('19840423', builder=NumPyTimeBuilder) numpy.datetime64('1984-04-23')
使用ISO 8601周日期格式分析日期:
>>> aniso8601.parse_date('1986-W38-1', builder=NumPyTimeBuilder) numpy.datetime64('1986-09-15')
要分析ISO 8601序号日期:
>>> aniso8601.parse_date('1988-132', builder=NumPyTimeBuilder) numpy.datetime64('1988-05-11')
解析时间
numpy不提供time64
类型,因此显式不支持解析时间:
>>> import aniso8601 >>> from numpytimebuilder import NumPyTimeBuilder >>> aniso8601.parse_time('11:31:14', builder=NumPyTimeBuilder) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/nielsenb/Jetfuse/numpytimebuilder/python2/lib/python2.7/site-packages/aniso8601/time.py", line 116, in parse_time return _RESOLUTION_MAP[get_time_resolution(timestr)](timestr, tz, builder) File "/home/nielsenb/Jetfuse/numpytimebuilder/python2/lib/python2.7/site-packages/aniso8601/time.py", line 165, in _parse_second_time return builder.build_time(hh=hourstr, mm=minutestr, ss=secondstr, tz=tz) File "numpytimebuilder/__init__.py", line 32, in build_time raise NotImplementedError('No compatible numpy time64 type.') NotImplementedError: No compatible numpy time64 type.
解析持续时间
numpy timedelta64
类型只支持每个delta的单个组件,因此durations作为timedelta64
对象的元组返回。
要分析格式化为ISO 8601字符串的持续时间:
>>> import aniso8601 >>> from numpytimebuilder import NumPyTimeBuilder >>> aniso8601.parse_duration('P1Y2M3DT4H54M6S', builder=NumPyTimeBuilder) (numpy.timedelta64(428,'D'), numpy.timedelta64(4,'h'), numpy.timedelta64(54,'m'), numpy.timedelta64(6,'s'), numpy.timedelta64(0,'ms'), numpy.timedelta64(0,'us'), numpy.timedelta64(0,'ns'), numpy.timedelta64(0,'ps'), numpy.timedelta64(0,'fs'), numpy.timedelta64(0,'as'))
支持降低精度:
>>> aniso8601.parse_duration('P1Y', builder=NumPyTimeBuilder) (numpy.timedelta64(365,'D'), numpy.timedelta64(0,'h'), numpy.timedelta64(0,'m'), numpy.timedelta64(0,'s'), numpy.timedelta64(0,'ms'), numpy.timedelta64(0,'us'), numpy.timedelta64(0,'ns'), numpy.timedelta64(0,'ps'), numpy.timedelta64(0,'fs'), numpy.timedelta64(0,'as'))
最低阶元素上允许有小数部分:
>>> aniso8601.parse_duration('P1YT3.5M', builder=NumPyTimeBuilder) (numpy.timedelta64(365,'D'), numpy.timedelta64(0,'h'), numpy.timedelta64(3,'m'), numpy.timedelta64(30,'s'), numpy.timedelta64(0,'ms'), numpy.timedelta64(0,'us'), numpy.timedelta64(0,'ns'), numpy.timedelta64(0,'ps'), numpy.timedelta64(0,'fs'), numpy.timedelta64(0,'as'))
小数部分可以用逗号而不是句号来指定:
>>> aniso8601.parse_duration('P1YT3,5M', builder=NumPyTimeBuilder) (numpy.timedelta64(365,'D'), numpy.timedelta64(0,'h'), numpy.timedelta64(3,'m'), numpy.timedelta64(30,'s'), numpy.timedelta64(0,'ms'), numpy.timedelta64(0,'us'), numpy.timedelta64(0,'ns'), numpy.timedelta64(0,'ps'), numpy.timedelta64(0,'fs'), numpy.timedelta64(0,'as'))
还支持从组合的日期和时间解析持续时间:
>>> aniso8601.parse_duration('P0001-01-02T01:30:5', builder=NumPyTimeBuilder) (numpy.timedelta64(397,'D'), numpy.timedelta64(1,'h'), numpy.timedelta64(30,'m'), numpy.timedelta64(5,'s'), numpy.timedelta64(0,'ms'), numpy.timedelta64(0,'us'), numpy.timedelta64(0,'ns'), numpy.timedelta64(0,'ps'), numpy.timedelta64(0,'fs'), numpy.timedelta64(0,'as'))
以上按365天计算年,按30天计算月。不支持日历级别的准确性。相应地支持部分年份和月份:
>>> aniso8601.parse_duration('P2.1Y', builder=NumPyTimeBuilder) (numpy.timedelta64(766,'D'), numpy.timedelta64(12,'h'), numpy.timedelta64(0,'m'), numpy.timedelta64(0,'s'), numpy.timedelta64(0,'ms'), numpy.timedelta64(0,'us'), numpy.timedelta64(0,'ns'), numpy.timedelta64(0,'ps'), numpy.timedelta64(0,'fs'), numpy.timedelta64(0,'as')) >>> aniso8601.parse_duration('P1Y0.5M', builder=NumPyTimeBuilder) (numpy.timedelta64(380,'D'), numpy.timedelta64(0,'h'), numpy.timedelta64(0,'m'), numpy.timedelta64(0,'s'), numpy.timedelta64(0,'ms'), numpy.timedelta64(0,'us'), numpy.timedelta64(0,'ns'), numpy.timedelta64(0,'ps'), numpy.timedelta64(0,'fs'), numpy.timedelta64(0,'as'))
应用持续时间
提供了apply_duration
helper函数,用于将duration元组应用于datetime64
对象。它需要一个dateime64
(来自parse_datetime
)、一个duration元组(来自parse_duration
)和一个Python operator来应用:
>>> import aniso8601 >>> import operator >>> from numpytimebuilder import NumPyTimeBuilder >>> from numpytimebuilder.util import apply_duration >>> datetime = aniso8601.parse_datetime('1977-06-10T12:00:00', builder=NumPyTimeBuilder) >>> duration = aniso8601.parse_duration('P3Y2M1DT1H2M3S', builder=NumPyTimeBuilder) >>> apply_duration(datetime, duration, operator.add) numpy.datetime64('1980-08-09T13:02:03')
请记住,可表示的日期时间跨度随着分辨率的增加而减小!有关详细信息,请参阅NumPy Datetime Units文档。
解析间隔
分析由开始和结束指定的间隔:
>>> import aniso8601 >>> from numpytimebuilder import NumPyTimeBuilder >>> aniso8601.parse_interval('2007-03-01T13:00:00/2008-05-11T15:30:00') (numpy.datetime64('2007-03-01T13:00:00'), numpy.datetime64('2008-05-11T15:30:00'))
支持由开始时间和持续时间指定的间隔:
>>> aniso8601.parse_interval('2007-03-01T13:00:00/P1Y2M10DT2H30M', builder=NumPyTimeBuilder) (numpy.datetime64('2007-03-01T13:00:00'), numpy.datetime64('2008-05-09T15:30:00'))
持续时间也可以由持续时间和结束时间指定:
>>> aniso8601.parse_interval('P1M/1981-04-05', builder=NumPyTimeBuilder) (numpy.datetime64('1981-04-05'), numpy.datetime64('1981-03-06'))
请注意,上述分析的结果不是从最早到最晚的顺序。如果需要排序间隔,只需使用sorted
关键字,如下所示:
>>> sorted(aniso8601.parse_interval('P1M/1981-04-05', builder=NumPyTimeBuilder)) [numpy.datetime64('1981-03-06'), numpy.datetime64('1981-04-05')]
当需要保持由持续时间指定的分辨率时,即使持续时间的开始被指定为日期,间隔的结束也会作为日期时间返回:
>>> aniso8601.parse_interval('2014-11-12/PT4H54M6.5S', builder=NumPyTimeBuilder) (numpy.datetime64('2014-11-12'), numpy.datetime64('2014-11-12T04:54:06.500')) >>> aniso8601.parse_interval('2007-03-01/P1.5D', builder=NumPyTimeBuilder) (numpy.datetime64('2007-03-01'), numpy.datetime64('2007-03-02T12:00:00'))
还支持重复间隔,并返回生成器:
>>> aniso8601.parse_repeating_interval('R3/1981-04-05/P1D', builder=NumPyTimeBuilder) <generator object _date_generator at 0x7fd76fe9abe0> >>> list(aniso8601.parse_repeating_interval('R3/1981-04-05/P1D', builder=NumPyTimeBuilder)) [numpy.datetime64('1981-04-05'), numpy.datetime64('1981-04-06'), numpy.datetime64('1981-04-07')]
允许重复间隔朝相反方向进行:
>>> list(aniso8601.parse_repeating_interval('R2/PT1H2M/1980-03-05T01:01:00', builder=NumPyTimeBuilder)) [numpy.datetime64('1980-03-05T01:01:00'), numpy.datetime64('1980-03-04T23:59:00')]
也允许无限间隔(python 2):
>>> result = aniso8601.parse_repeating_interval('R/PT1H2M/1980-03-05T01:01:00', builder=NumPyTimeBuilder) >>> result.next() numpy.datetime64('1980-03-05T01:01:00') >>> result.next() numpy.datetime64('1980-03-04T23:59:00')
或者对于python 3:
>>> result = aniso8601.parse_repeating_interval('R/PT1H2M/1980-03-05T01:01:00', builder=NumPyTimeBuilder) >>> next(result) numpy.datetime64('1980-03-05T01:01:00') >>> next(result) numpy.datetime64('1980-03-04T23:59:00')
以上按365天计算年,按30天计算月。不支持日历级别的准确性。相应地支持部分月份和年份:
>>> aniso8601.parse_interval('P1.1Y/2001-02-28', builder=NumPyTimeBuilder) (numpy.datetime64('2001-02-28'), numpy.datetime64('2000-01-24')) >>> aniso8601.parse_interval('2001-02-28/P1Y2.5M', builder=NumPyTimeBuilder) (numpy.datetime64('2001-02-28'), numpy.datetime64('2002-05-14'))
开发
设置
建议使用virtualenv开发。
测试
测试可以使用setuptools<;https://setuptools.readthedocs.io/en/latest/setuptools.html>;:
$ python setup.py test