onetick-py 1.171.0__tar.gz → 1.172.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. {onetick_py-1.171.0/src/onetick_py.egg-info → onetick_py-1.172.0}/PKG-INFO +4 -2
  2. {onetick_py-1.171.0 → onetick_py-1.172.0}/README.md +3 -1
  3. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/_version.py +1 -1
  4. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/source_methods/writes.py +48 -33
  5. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/column_operations/_methods/methods.py +1 -4
  6. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/column_operations/accessors/_accessor.py +4 -6
  7. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/column_operations/accessors/decimal_accessor.py +20 -8
  8. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/column_operations/accessors/dt_accessor.py +137 -68
  9. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/column_operations/accessors/float_accessor.py +35 -15
  10. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/column_operations/accessors/str_accessor.py +0 -7
  11. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/column_operations/base.py +72 -12
  12. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/multi_output_source.py +41 -2
  13. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/db/db.py +2 -2
  14. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/functions.py +7 -1
  15. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/math.py +137 -28
  16. {onetick_py-1.171.0 → onetick_py-1.172.0/src/onetick_py.egg-info}/PKG-INFO +4 -2
  17. {onetick_py-1.171.0 → onetick_py-1.172.0}/LICENSE +0 -0
  18. {onetick_py-1.171.0 → onetick_py-1.172.0}/pyproject.toml +0 -0
  19. {onetick_py-1.171.0 → onetick_py-1.172.0}/requirements.strict.txt +0 -0
  20. {onetick_py-1.171.0 → onetick_py-1.172.0}/requirements.txt +0 -0
  21. {onetick_py-1.171.0 → onetick_py-1.172.0}/setup.cfg +0 -0
  22. {onetick_py-1.171.0 → onetick_py-1.172.0}/setup.py +0 -0
  23. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/locator_parser/__init__.py +0 -0
  24. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/locator_parser/acl.py +0 -0
  25. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/locator_parser/actions.py +0 -0
  26. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/locator_parser/common.py +0 -0
  27. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/locator_parser/io.py +0 -0
  28. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/locator_parser/locator.py +0 -0
  29. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/__init__.py +0 -0
  30. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/doc_utilities/__init__.py +0 -0
  31. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/doc_utilities/napoleon.py +0 -0
  32. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/doc_utilities/ot_doctest.py +0 -0
  33. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/doc_utilities/snippets.py +0 -0
  34. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/lib/__init__.py +0 -0
  35. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/lib/instance.py +0 -0
  36. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/__init__.py +0 -0
  37. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/_stack_info.py +0 -0
  38. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/aggregations/__init__.py +0 -0
  39. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/aggregations/_base.py +0 -0
  40. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/aggregations/_docs.py +0 -0
  41. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/aggregations/compute.py +0 -0
  42. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/aggregations/functions.py +0 -0
  43. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/aggregations/generic.py +0 -0
  44. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/aggregations/high_low.py +0 -0
  45. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/aggregations/num_distinct.py +0 -0
  46. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/aggregations/order_book.py +0 -0
  47. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/aggregations/other.py +0 -0
  48. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/backports.py +0 -0
  49. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/cache.py +0 -0
  50. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/callback/__init__.py +0 -0
  51. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/callback/callback.py +0 -0
  52. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/callback/callbacks.py +0 -0
  53. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/compatibility.py +0 -0
  54. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/configuration.py +0 -0
  55. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/__init__.py +0 -0
  56. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_csv_inspector.py +0 -0
  57. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_internal/__init__.py +0 -0
  58. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_internal/_manually_bound_value.py +0 -0
  59. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_internal/_nodes_history.py +0 -0
  60. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_internal/_op_utils/__init__.py +0 -0
  61. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_internal/_op_utils/every_operand.py +0 -0
  62. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_internal/_op_utils/is_const.py +0 -0
  63. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_internal/_per_tick_scripts/tick_list_sort_template.script +0 -0
  64. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_internal/_proxy_node.py +0 -0
  65. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_internal/_state_objects.py +0 -0
  66. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_internal/_state_vars.py +0 -0
  67. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/__init__.py +0 -0
  68. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/_symbol_param.py +0 -0
  69. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/schema.py +0 -0
  70. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/source_methods/__init__.py +0 -0
  71. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/source_methods/aggregations.py +0 -0
  72. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/source_methods/applyers.py +0 -0
  73. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/source_methods/columns.py +0 -0
  74. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/source_methods/data_quality.py +0 -0
  75. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/source_methods/debugs.py +0 -0
  76. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/source_methods/drops.py +0 -0
  77. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/source_methods/fields.py +0 -0
  78. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/source_methods/filters.py +0 -0
  79. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/source_methods/joins.py +0 -0
  80. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/source_methods/merges.py +0 -0
  81. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/source_methods/misc.py +0 -0
  82. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/source_methods/pandases.py +0 -0
  83. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/source_methods/renames.py +0 -0
  84. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/source_methods/sorts.py +0 -0
  85. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/source_methods/switches.py +0 -0
  86. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/source_methods/symbols.py +0 -0
  87. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/source_methods/times.py +0 -0
  88. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/symbol.py +0 -0
  89. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/_source/tmp_otq.py +0 -0
  90. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/column.py +0 -0
  91. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/column_operations/__init__.py +0 -0
  92. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/column_operations/_methods/__init__.py +0 -0
  93. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/column_operations/_methods/_internal.py +0 -0
  94. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/column_operations/_methods/conversions.py +0 -0
  95. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/column_operations/_methods/op_types.py +0 -0
  96. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/column_operations/accessors/__init__.py +0 -0
  97. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/cut_builder.py +0 -0
  98. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/db_constants.py +0 -0
  99. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/eval_query.py +0 -0
  100. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/lambda_object.py +0 -0
  101. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/per_tick_script.py +0 -0
  102. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/query_inspector.py +0 -0
  103. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/core/source.py +0 -0
  104. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/db/__init__.py +0 -0
  105. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/db/_inspection.py +0 -0
  106. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/db/utils.py +0 -0
  107. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/docs/__init__.py +0 -0
  108. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/docs/docstring_parser.py +0 -0
  109. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/docs/utils.py +0 -0
  110. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/license.py +0 -0
  111. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/log.py +0 -0
  112. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/misc.py +0 -0
  113. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/oqd/__init__.py +0 -0
  114. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/oqd/eps.py +0 -0
  115. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/oqd/sources.py +0 -0
  116. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/otq.py +0 -0
  117. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/pyomd_mock.py +0 -0
  118. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/run.py +0 -0
  119. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/servers.py +0 -0
  120. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/session.py +0 -0
  121. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/sources/__init__.py +0 -0
  122. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/sources/cache.py +0 -0
  123. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/sources/common.py +0 -0
  124. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/sources/csv.py +0 -0
  125. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/sources/custom.py +0 -0
  126. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/sources/data_file.py +0 -0
  127. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/sources/data_source.py +0 -0
  128. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/sources/empty.py +0 -0
  129. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/sources/odbc.py +0 -0
  130. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/sources/order_book.py +0 -0
  131. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/sources/parquet.py +0 -0
  132. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/sources/pit.py +0 -0
  133. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/sources/query.py +0 -0
  134. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/sources/snapshots.py +0 -0
  135. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/sources/split_query_output_by_symbol.py +0 -0
  136. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/sources/symbology_mapping.py +0 -0
  137. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/sources/symbols.py +0 -0
  138. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/sources/ticks.py +0 -0
  139. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/sql.py +0 -0
  140. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/state.py +0 -0
  141. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/types.py +0 -0
  142. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/utils/__init__.py +0 -0
  143. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/utils/acl.py +0 -0
  144. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/utils/config.py +0 -0
  145. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/utils/default.py +0 -0
  146. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/utils/file.py +0 -0
  147. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/utils/helpers.py +0 -0
  148. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/utils/locator.py +0 -0
  149. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/utils/perf.py +0 -0
  150. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/utils/query.py +0 -0
  151. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/utils/render.py +0 -0
  152. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/utils/script.py +0 -0
  153. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/utils/temp.py +0 -0
  154. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/utils/types.py +0 -0
  155. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick/py/utils/tz.py +0 -0
  156. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick_py.egg-info/SOURCES.txt +0 -0
  157. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick_py.egg-info/dependency_links.txt +0 -0
  158. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick_py.egg-info/entry_points.txt +0 -0
  159. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick_py.egg-info/requires.txt +0 -0
  160. {onetick_py-1.171.0 → onetick_py-1.172.0}/src/onetick_py.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: onetick-py
3
- Version: 1.171.0
3
+ Version: 1.172.0
4
4
  Summary: Python package that allows you to work with OneTick
5
5
  Author-email: solutions <solutions@onetick.com>
6
6
  License-Expression: MIT
@@ -85,7 +85,7 @@ The latest version of ``onetick-py`` is available on PyPI: <https://pypi.org/pro
85
85
 
86
86
  pip install onetick-py[webapi]
87
87
 
88
- Use ``webapi`` extra to easily use it with remote OneTick Cloud server.
88
+ Use ``webapi`` extra to easily use it with remote OneTick REST Servers, such as [OneTick Cloud](https://www.onetick.com/cloud-services).
89
89
 
90
90
  See [Getting Started](https://docs.pip.distribution.sol.onetick.com/static/getting_started/root.html)
91
91
  section in the documentation to see how quickly set up ``onetick-py`` configuration
@@ -112,6 +112,8 @@ section in the documentation.
112
112
  - **Data Visualization**: Compatible with OneTick's visualization tool, OneTick Dashboard.
113
113
  - **Machine Learning**: Integrates with the OneTick ML library [onetick-ml](https://dsframework.pip.distribution.sol.onetick.com/intro.html).
114
114
  - **Industry Applications**: Industry leading OneTick's Trade Surveillance and BestEx/TCA solutions are written in ``onetick.py``.
115
+ - **Back Testing**: Retrieve historic market data and metrics.
116
+ - **Market Microstructure**: Consolidated Book Depth analysis.
115
117
 
116
118
  ## Advantages Over Competitors
117
119
 
@@ -22,7 +22,7 @@ The latest version of ``onetick-py`` is available on PyPI: <https://pypi.org/pro
22
22
 
23
23
  pip install onetick-py[webapi]
24
24
 
25
- Use ``webapi`` extra to easily use it with remote OneTick Cloud server.
25
+ Use ``webapi`` extra to easily use it with remote OneTick REST Servers, such as [OneTick Cloud](https://www.onetick.com/cloud-services).
26
26
 
27
27
  See [Getting Started](https://docs.pip.distribution.sol.onetick.com/static/getting_started/root.html)
28
28
  section in the documentation to see how quickly set up ``onetick-py`` configuration
@@ -49,6 +49,8 @@ section in the documentation.
49
49
  - **Data Visualization**: Compatible with OneTick's visualization tool, OneTick Dashboard.
50
50
  - **Machine Learning**: Integrates with the OneTick ML library [onetick-ml](https://dsframework.pip.distribution.sol.onetick.com/intro.html).
51
51
  - **Industry Applications**: Industry leading OneTick's Trade Surveillance and BestEx/TCA solutions are written in ``onetick.py``.
52
+ - **Back Testing**: Retrieve historic market data and metrics.
53
+ - **Market Microstructure**: Consolidated Book Depth analysis.
52
54
 
53
55
  ## Advantages Over Competitors
54
56
 
@@ -1,2 +1,2 @@
1
1
  # This file was generated automatically. DO NOT CHANGE.
2
- VERSION = '1.171.0'
2
+ VERSION = '1.172.0'
@@ -23,8 +23,8 @@ def write(
23
23
  symbol: Union[str, 'otp.Column', None] = None,
24
24
  tick_type: Union[str, 'otp.Column', None] = None,
25
25
  date: Union[datetime.date, Type[adaptive], None] = adaptive,
26
- start: Optional[datetime.date] = None,
27
- end: Optional[datetime.date] = None,
26
+ start_date: Optional[datetime.date] = None,
27
+ end_date: Optional[datetime.date] = None,
28
28
  append: bool = False,
29
29
  keep_symbol_and_tick_type: Union[bool, Type[adaptive]] = adaptive,
30
30
  propagate: bool = True,
@@ -72,22 +72,21 @@ def write(
72
72
  date where to save data.
73
73
  Should be set to `None` if writing to accelerator or memory database.
74
74
  By default, it is set to `otp.config.default_date`.
75
- start: :py:class:`otp.datetime <onetick.py.datetime>` or None
75
+ start_date: :py:class:`otp.datetime <onetick.py.datetime>` or None
76
76
  Start date for data to save. It is inclusive.
77
77
  Cannot be used with ``date`` parameter.
78
78
  Also cannot be used with ``inplace`` set to ``True``.
79
79
  Should be set to `None` if writing to accelerator or memory database.
80
80
  By default, None.
81
- end: :py:class:`otp.datetime <onetick.py.datetime>` or None
82
- End date for data to save. It is exclusive, so be sure to set
83
- it to the next day after the last day in data.
81
+ end_date: :py:class:`otp.datetime <onetick.py.datetime>` or None
82
+ End date for data to save. It is inclusive.
84
83
  Cannot be used with ``date`` parameter.
85
84
  Also cannot be used with ``inplace`` set to ``True``.
86
85
  Should be set to `None` if writing to accelerator or memory database.
87
86
  By default, None.
88
87
  append: bool
89
88
  If False - data will be rewritten for this ``date``
90
- or range of dates (from ``start`` to ``end``),
89
+ or range of dates (from ``start_date`` to ``end_date``),
91
90
  otherwise data will be appended: new symbols are added,
92
91
  existing symbols can be modified (append new ticks, modify existing ticks).
93
92
  This option is not valid for accelerator databases.
@@ -100,12 +99,12 @@ def write(
100
99
  propagate: bool
101
100
  Propagate ticks after that event processor or not.
102
101
  out_of_range_tick_action: str
103
- Action to be executed if tick's timestamp's date is not ``date`` or between ``start`` or ``end``:
102
+ Action to be executed if tick's timestamp's date is not ``date`` or between ``start_date`` or ``end_date``:
104
103
 
105
104
  * `exception`: runtime exception will be raised
106
105
  * `ignore`: tick will not be written to the database
107
106
  * `load`: writes tick to the database anyway.
108
- Can be used only with ``date``, not with ``start``+``end``.
107
+ Can be used only with ``date``, not with ``start_date``+``end_date``.
109
108
 
110
109
  Default: `exception`
111
110
  timestamp: Column
@@ -134,7 +133,7 @@ def write(
134
133
  A flag controls whether operation should be applied inplace.
135
134
  If ``inplace=True``, then it returns nothing.
136
135
  Otherwise, method returns a new modified object.
137
- Cannot be ``True`` if ``start`` and ``end`` are set.
136
+ Cannot be ``True`` if ``start_date`` and ``end_date`` are set.
138
137
  kwargs:
139
138
  .. deprecated:: 1.21.0
140
139
 
@@ -176,6 +175,15 @@ def write(
176
175
  warnings.warn("Parameter 'keep_timestamp_field' is deprecated, use 'keep_timestamp'", FutureWarning)
177
176
  keep_timestamp = kwargs.pop('keep_timestamp_field')
178
177
 
178
+ if 'start' in kwargs:
179
+ warnings.warn("Parameter 'start' is deprecated, use 'start_date'", FutureWarning)
180
+ start_date = kwargs.pop('start')
181
+
182
+ if 'end' in kwargs:
183
+ warnings.warn("Parameter 'end' is deprecated, use 'end_date'", FutureWarning)
184
+ # Parameter 'end' was exclusive. Parameter 'end_date' is inclusive.
185
+ end_date = kwargs.pop('end') - otp.Day(1)
186
+
179
187
  if kwargs:
180
188
  raise TypeError(f'write() got unexpected arguments: {list(kwargs)}')
181
189
 
@@ -194,15 +202,18 @@ def write(
194
202
  f'Field "{field_name}" contains lowercase characters and cannot be saved to a Onetick database'
195
203
  )
196
204
 
197
- if date is not adaptive and (start or end):
198
- raise ValueError('date cannot be used with start+end')
205
+ if date is not adaptive and (start_date or end_date):
206
+ raise ValueError('date cannot be used with start_date+end_date')
199
207
 
200
- if date is adaptive and (start and end) and inplace:
208
+ if date is adaptive and (start_date and end_date) and inplace:
201
209
  # join_with_query and merge are used for multiple dates, so inplace is not supported
202
- raise ValueError('cannot run on multiple dates if inplace is True, use one value for date instead of start+end')
210
+ raise ValueError(
211
+ 'cannot run on multiple dates if inplace is True,'
212
+ ' use one value for date instead of start_date+end_date'
213
+ )
203
214
 
204
- if (start and not end) or (not start and end):
205
- raise ValueError('start and end should be both specified or both None')
215
+ if (start_date and not end_date) or (not start_date and end_date):
216
+ raise ValueError('start_date and end_date should be both specified or both None')
206
217
 
207
218
  if date is adaptive:
208
219
  date = configuration.config.default_date
@@ -244,10 +255,10 @@ def write(
244
255
  # let's ignore
245
256
  pass
246
257
  elif out_of_range_tick_action.upper() == 'LOAD':
247
- if start and end:
248
- raise ValueError('LOAD out_of_range_tick_action cannot be used with start+end, use date instead')
258
+ if start_date and end_date:
259
+ raise ValueError('LOAD out_of_range_tick_action cannot be used with start_date+end_date, use date instead')
249
260
  elif out_of_range_tick_action.upper() == 'EXCEPTION':
250
- if start and end:
261
+ if start_date and end_date:
251
262
  # WRITE_TO_ONETICK_DB use DAY_BOUNDARY_TZ and DAY_BOUNDARY_OFFSET
252
263
  # to check tick timestamp is out of range or not
253
264
  # so we mimic it here with THROW event processor
@@ -259,10 +270,12 @@ def write(
259
270
  {'DAY_BOUNDARY_TZ': '__DAY_BOUNDARY_TZ', 'DAY_BOUNDARY_OFFSET': '__DAY_BOUNDARY_OFFSET'}, inplace=True
260
271
  )
261
272
  self = self.join_with_query(src, symbol=f"{str(db)}::DUMMY", caching='per_symbol')
262
- start_formatted = start.strftime('%Y-%m-%d')
263
- end_formatted = end.strftime('%Y-%m-%d')
264
- convert_timestamp = self['TIMESTAMP'].dt.strftime('%Y%m%d%H%M%S.%J', timezone=self['__DAY_BOUNDARY_TZ'])
265
- start_op = otp.dt(start).to_operation(timezone=self['__DAY_BOUNDARY_TZ']) + self['__DAY_BOUNDARY_OFFSET']
273
+ timezone = self['__DAY_BOUNDARY_TZ']
274
+ offset = self['__DAY_BOUNDARY_OFFSET']
275
+ convert_timestamp = self['TIMESTAMP'].dt.strftime('%Y%m%d%H%M%S.%J', timezone=timezone)
276
+
277
+ start_formatted = start_date.strftime('%Y-%m-%d')
278
+ start_op = otp.dt(start_date).to_operation(timezone=timezone) + offset
266
279
  self.throw(
267
280
  where=(self['TIMESTAMP'] < start_op),
268
281
  message=(
@@ -270,11 +283,14 @@ def write(
270
283
  + convert_timestamp
271
284
  + ' of a tick, visible or hidden, '
272
285
  + f'earlier than {start_formatted} in timezone '
273
- + self['__DAY_BOUNDARY_TZ']
286
+ + timezone
274
287
  ),
275
288
  inplace=True,
276
289
  )
277
- end_op = otp.dt(end).to_operation(timezone=self['__DAY_BOUNDARY_TZ']) + self['__DAY_BOUNDARY_OFFSET']
290
+
291
+ end = end_date + otp.Day(1) # end_date is inclusive
292
+ end_formatted = end.strftime('%Y-%m-%d')
293
+ end_op = otp.dt(end).to_operation(timezone=timezone) + offset
278
294
  self.throw(
279
295
  where=(self['TIMESTAMP'] >= end_op),
280
296
  message=(
@@ -282,10 +298,11 @@ def write(
282
298
  + convert_timestamp
283
299
  + ' of a tick, visible or hidden, '
284
300
  + f'later than {end_formatted} in timezone '
285
- + self['__DAY_BOUNDARY_TZ']
301
+ + timezone
286
302
  ),
287
303
  inplace=True,
288
304
  )
305
+ self.drop(['__DAY_BOUNDARY_TZ', '__DAY_BOUNDARY_OFFSET'], inplace=True)
289
306
  else:
290
307
  raise ValueError(
291
308
  f'Unknown out_of_range_tick_action: {out_of_range_tick_action}.'
@@ -303,18 +320,16 @@ def write(
303
320
  use_context_of_query=use_context_of_query,
304
321
  )
305
322
 
306
- if start and end:
307
- days = (end - start).days
323
+ if start_date and end_date:
324
+ days = (end_date - start_date).days
308
325
  if days < 0:
309
- raise ValueError("Parameter 'start' must be less than parameter 'end'")
310
- if days == 0:
311
- raise ValueError("Parameters 'start' and 'end' must specify different dates")
326
+ raise ValueError("Parameter 'start_date' must be less than or equal to parameter 'end_date'")
312
327
  branches = []
313
- for i in range(days):
328
+ for i in range(days + 1):
314
329
  branch = self.copy()
315
330
  branch.sink(
316
331
  otq.WriteToOnetickDb(
317
- date=(start + otp.Day(i)).strftime('%Y%m%d'),
332
+ date=(start_date + otp.Day(i)).strftime('%Y%m%d'),
318
333
  propagate_ticks=propagate,
319
334
  out_of_range_tick_action='IGNORE',
320
335
  **kwargs,
@@ -14,10 +14,7 @@ class DatetimeSubtractionWarning(FutureWarning):
14
14
 
15
15
 
16
16
  def round(prev_op, precision):
17
- if precision is not None:
18
- return MethodResult(f'round_double({str(prev_op)},{str(precision)})', float)
19
- else:
20
- return MethodResult(f'round({str(prev_op)})', int)
17
+ return MethodResult(f'round_double({str(prev_op)},{str(precision)})', float)
21
18
 
22
19
 
23
20
  def isin(prev_op, items):
@@ -11,13 +11,11 @@ class _Accessor:
11
11
  self._base_column = base_column
12
12
 
13
13
  class Formatter(_Operation):
14
+ def __init__(self, dtype, formatter, op_params):
15
+ def op_func(*args, **kwargs):
16
+ return formatter(*args, **kwargs), dtype
14
17
 
15
- def __init__(self, base_column, dtype, formatter):
16
- super().__init__(dtype=dtype, op_params=[base_column])
17
- self._formatter = formatter
18
-
19
- def __str__(self):
20
- return self._formatter(str(self._op_params[0]))
18
+ super().__init__(op_func=op_func, op_params=op_params, dtype=dtype)
21
19
 
22
20
  def _preprocess_tz_and_format(self,
23
21
  timezone: typing.Union[Operation, str, None],
@@ -1,5 +1,6 @@
1
1
  from onetick.py import types as ott
2
2
  from onetick.py.core.column_operations.accessors._accessor import _Accessor
3
+ from onetick.py.core.column_operations.base import _Operation
3
4
 
4
5
 
5
6
  class _DecimalAccessor(_Accessor):
@@ -37,10 +38,16 @@ class _DecimalAccessor(_Accessor):
37
38
  3 3.142
38
39
  Name: X, dtype: object
39
40
  """
41
+ def formatter(column, _precision):
42
+ column = ott.value2str(column)
43
+ _precision = ott.value2str(_precision)
44
+
45
+ return f'decimal_to_string({column}, {_precision})'
46
+
40
47
  return _DecimalAccessor.Formatter(
41
- self._base_column,
42
- str,
43
- formatter=lambda x: f'decimal_to_string({x}, {precision})'
48
+ op_params=[self._base_column, precision],
49
+ dtype=str,
50
+ formatter=formatter,
44
51
  )
45
52
 
46
53
  def cmp(self, other, eps):
@@ -83,10 +90,15 @@ class _DecimalAccessor(_Accessor):
83
90
  4 1.0
84
91
  Name: X, dtype: float64
85
92
  """
86
- other = ott.value2str(other)
87
- eps = ott.value2str(eps)
93
+
94
+ def formatter(column, _other, _eps):
95
+ column = ott.value2str(column)
96
+ _other = ott.value2str(_other)
97
+ _eps = ott.value2str(_eps)
98
+ return f'decimal_compare({column}, {_other}, {_eps})'
99
+
88
100
  return _DecimalAccessor.Formatter(
89
- self._base_column,
90
- ott.decimal,
91
- formatter=lambda x: f'decimal_compare({x}, {other}, {eps})'
101
+ op_params=[self._base_column, other, eps],
102
+ dtype=ott.decimal,
103
+ formatter=formatter,
92
104
  )
@@ -1,6 +1,7 @@
1
1
  from typing import Union
2
2
 
3
3
  from onetick.py import configuration, utils
4
+ from onetick.py import types as ott
4
5
  from onetick.py.core.column_operations.accessors._accessor import _Accessor
5
6
  from onetick.py.backports import Literal
6
7
  from onetick.py.types import datetime, value2str
@@ -76,14 +77,17 @@ class _DtAccessor(_Accessor):
76
77
  """
77
78
  if timezone is utils.default:
78
79
  timezone = configuration.config.tz
79
- timezone, format_str = self._preprocess_tz_and_format(timezone, format)
80
80
 
81
- def formatter(x):
82
- return f'nsectime_format({format_str},{x},{timezone})'
81
+ def formatter(column, _format, _timezone):
82
+ column = ott.value2str(column)
83
+ _timezone, _format = self._preprocess_tz_and_format(_timezone, _format)
84
+ return f'nsectime_format({_format},{column},{_timezone})'
83
85
 
84
- return _DtAccessor.Formatter(self._base_column,
85
- str,
86
- formatter=formatter)
86
+ return _DtAccessor.Formatter(
87
+ op_params=[self._base_column, format, timezone],
88
+ dtype=str,
89
+ formatter=formatter,
90
+ )
87
91
 
88
92
  def date(self):
89
93
  """
@@ -103,7 +107,9 @@ class _DtAccessor(_Accessor):
103
107
  return self.strftime(format_str, None).str.to_datetime(format_str, None)
104
108
 
105
109
  @docstring(parameters=[_timezone_doc], add_self=True)
106
- def day_of_week(self, start_index: int = 1, start_day: Literal['monday', 'sunday'] = 'monday', timezone=None):
110
+ def day_of_week(
111
+ self, start_index: Union[int, _Operation] = 1, start_day: Literal['monday', 'sunday'] = 'monday', timezone=None,
112
+ ):
107
113
  """
108
114
  Return the day of the week.
109
115
 
@@ -112,7 +118,7 @@ class _DtAccessor(_Accessor):
112
118
 
113
119
  Parameters
114
120
  ----------
115
- start_index: int
121
+ start_index: int or Operation
116
122
  Sunday index.
117
123
  start_day: 'monday' or 'sunday'
118
124
  Day that will be denoted with ``start_index``
@@ -135,19 +141,22 @@ class _DtAccessor(_Accessor):
135
141
  if start_day not in ['monday', 'sunday']:
136
142
  raise ValueError(f"'start_day' parameter ({start_day}) not in ['monday', 'sunday']")
137
143
 
138
- timezone, _ = self._preprocess_tz_and_format(timezone, '')
139
-
140
- def formatter(x):
141
- format_ = f'day_of_week({x},{timezone})'
142
- if start_day == 'monday':
144
+ def formatter(column, _start_index, _start_day, _timezone):
145
+ column = ott.value2str(column)
146
+ _start_index = ott.value2str(_start_index)
147
+ _timezone, _ = self._preprocess_tz_and_format(_timezone, '')
148
+ format_ = f'day_of_week({column},{_timezone})'
149
+ if _start_day == 'monday':
143
150
  # CASE should be uppercased because it can be used in per-tick script
144
151
  format_ = f'CASE({format_}, 0, 7, {format_})-1'
145
- format_ += f'+{start_index}'
152
+ format_ += f'+{_start_index}'
146
153
  return format_
147
154
 
148
- return _DtAccessor.Formatter(self._base_column,
149
- int,
150
- formatter=formatter)
155
+ return _DtAccessor.Formatter(
156
+ op_params=[self._base_column, start_index, start_day, timezone],
157
+ dtype=int,
158
+ formatter=formatter,
159
+ )
151
160
 
152
161
  @docstring(parameters=[_timezone_doc], add_self=True)
153
162
  def day_name(self, timezone=None):
@@ -168,11 +177,16 @@ class _DtAccessor(_Accessor):
168
177
  5 2022-05-15 Sunday
169
178
  6 2022-05-16 Monday
170
179
  """
171
- timezone, _ = self._preprocess_tz_and_format(timezone, '')
180
+ def formatter(column, _timezone):
181
+ column = ott.value2str(column)
182
+ _timezone, _ = self._preprocess_tz_and_format(_timezone, '')
183
+ return f'DAYNAME({column},{_timezone})'
172
184
 
173
- return _DtAccessor.Formatter(self._base_column,
174
- str,
175
- formatter=lambda x: f'DAYNAME({x},{timezone})')
185
+ return _DtAccessor.Formatter(
186
+ op_params=[self._base_column, timezone],
187
+ dtype=str,
188
+ formatter=formatter,
189
+ )
176
190
 
177
191
  @docstring(parameters=[_timezone_doc], add_self=True)
178
192
  def day_of_month(self, timezone=None):
@@ -193,11 +207,16 @@ class _DtAccessor(_Accessor):
193
207
  5 2022-05-15 15
194
208
  6 2022-05-16 16
195
209
  """
196
- timezone, _ = self._preprocess_tz_and_format(timezone, '')
210
+ def formatter(column, _timezone):
211
+ column = ott.value2str(column)
212
+ _timezone, _ = self._preprocess_tz_and_format(_timezone, '')
213
+ return f'DAYOFMONTH({column},{_timezone})'
197
214
 
198
- return _DtAccessor.Formatter(self._base_column,
199
- int,
200
- formatter=lambda x: f'DAYOFMONTH({x},{timezone})')
215
+ return _DtAccessor.Formatter(
216
+ op_params=[self._base_column, timezone],
217
+ dtype=int,
218
+ formatter=formatter,
219
+ )
201
220
 
202
221
  @docstring(parameters=[_timezone_doc], add_self=True)
203
222
  def day_of_year(self, timezone=None):
@@ -218,11 +237,16 @@ class _DtAccessor(_Accessor):
218
237
  5 2022-05-15 135
219
238
  6 2022-05-16 136
220
239
  """
221
- timezone, _ = self._preprocess_tz_and_format(timezone, '')
240
+ def formatter(column, _timezone):
241
+ column = ott.value2str(column)
242
+ _timezone, _ = self._preprocess_tz_and_format(_timezone, '')
243
+ return f'DAYOFYEAR({column},{_timezone})'
222
244
 
223
- return _DtAccessor.Formatter(self._base_column,
224
- int,
225
- formatter=lambda x: f'DAYOFYEAR({x},{timezone})')
245
+ return _DtAccessor.Formatter(
246
+ op_params=[self._base_column, timezone],
247
+ dtype=int,
248
+ formatter=formatter,
249
+ )
226
250
 
227
251
  @docstring(parameters=[_timezone_doc], add_self=True)
228
252
  def hour(self, timezone=None):
@@ -243,11 +267,16 @@ class _DtAccessor(_Accessor):
243
267
  5 2022-05-01 15:00:06 15
244
268
  6 2022-05-01 16:00:06 16
245
269
  """
246
- timezone, _ = self._preprocess_tz_and_format(timezone, '')
270
+ def formatter(column, _timezone):
271
+ column = ott.value2str(column)
272
+ _timezone, _ = self._preprocess_tz_and_format(_timezone, '')
273
+ return f'HOUR({column},{_timezone})'
247
274
 
248
- return _DtAccessor.Formatter(self._base_column,
249
- int,
250
- formatter=lambda x: f'HOUR({x},{timezone})')
275
+ return _DtAccessor.Formatter(
276
+ op_params=[self._base_column, timezone],
277
+ dtype=int,
278
+ formatter=formatter,
279
+ )
251
280
 
252
281
  @docstring(parameters=[_timezone_doc], add_self=True)
253
282
  def minute(self, timezone=None):
@@ -269,11 +298,16 @@ class _DtAccessor(_Accessor):
269
298
  5 2022-05-01 15:15:06 15
270
299
  6 2022-05-01 15:16:06 16
271
300
  """
272
- timezone, _ = self._preprocess_tz_and_format(timezone, '')
301
+ def formatter(column, _timezone):
302
+ column = ott.value2str(column)
303
+ _timezone, _ = self._preprocess_tz_and_format(_timezone, '')
304
+ return f'MINUTE({column},{_timezone})'
273
305
 
274
- return _DtAccessor.Formatter(self._base_column,
275
- int,
276
- formatter=lambda x: f'MINUTE({x},{timezone})')
306
+ return _DtAccessor.Formatter(
307
+ op_params=[self._base_column, timezone],
308
+ dtype=int,
309
+ formatter=formatter,
310
+ )
277
311
 
278
312
  @docstring(parameters=[_timezone_doc], add_self=True)
279
313
  def second(self, timezone=None):
@@ -294,11 +328,16 @@ class _DtAccessor(_Accessor):
294
328
  5 2022-05-01 15:11:15 15
295
329
  6 2022-05-01 15:11:16 16
296
330
  """
297
- timezone, _ = self._preprocess_tz_and_format(timezone, '')
331
+ def formatter(column, _timezone):
332
+ column = ott.value2str(column)
333
+ _timezone, _ = self._preprocess_tz_and_format(_timezone, '')
334
+ return f'SECOND({column},{_timezone})'
298
335
 
299
- return _DtAccessor.Formatter(self._base_column,
300
- int,
301
- formatter=lambda x: f'SECOND({x},{timezone})')
336
+ return _DtAccessor.Formatter(
337
+ op_params=[self._base_column, timezone],
338
+ dtype=int,
339
+ formatter=formatter,
340
+ )
302
341
 
303
342
  @docstring(parameters=[_timezone_doc], add_self=True)
304
343
  def month(self, timezone=None):
@@ -320,11 +359,16 @@ class _DtAccessor(_Accessor):
320
359
  6 2022-09-01 9
321
360
  7 2022-10-01 10
322
361
  """
323
- timezone, _ = self._preprocess_tz_and_format(timezone, '')
362
+ def formatter(column, _timezone):
363
+ column = ott.value2str(column)
364
+ _timezone, _ = self._preprocess_tz_and_format(_timezone, '')
365
+ return f'MONTH({column},{_timezone})'
324
366
 
325
- return _DtAccessor.Formatter(self._base_column,
326
- int,
327
- formatter=lambda x: f'MONTH({x},{timezone})')
367
+ return _DtAccessor.Formatter(
368
+ op_params=[self._base_column, timezone],
369
+ dtype=int,
370
+ formatter=formatter,
371
+ )
328
372
 
329
373
  @docstring(parameters=[_timezone_doc], add_self=True)
330
374
  def month_name(self, timezone=None):
@@ -346,11 +390,16 @@ class _DtAccessor(_Accessor):
346
390
  6 2022-09-01 Sep
347
391
  7 2022-10-01 Oct
348
392
  """
349
- timezone, _ = self._preprocess_tz_and_format(timezone, '')
393
+ def formatter(column, _timezone):
394
+ column = ott.value2str(column)
395
+ _timezone, _ = self._preprocess_tz_and_format(_timezone, '')
396
+ return f'MONTHNAME({column},{_timezone})'
350
397
 
351
- return _DtAccessor.Formatter(self._base_column,
352
- str,
353
- formatter=lambda x: f'MONTHNAME({x},{timezone})')
398
+ return _DtAccessor.Formatter(
399
+ op_params=[self._base_column, timezone],
400
+ dtype=str,
401
+ formatter=formatter,
402
+ )
354
403
 
355
404
  @docstring(parameters=[_timezone_doc], add_self=True)
356
405
  def quarter(self, timezone=None):
@@ -372,11 +421,16 @@ class _DtAccessor(_Accessor):
372
421
  6 2022-09-01 3
373
422
  7 2022-10-01 4
374
423
  """
375
- timezone, _ = self._preprocess_tz_and_format(timezone, '')
424
+ def formatter(column, _timezone):
425
+ column = ott.value2str(column)
426
+ _timezone, _ = self._preprocess_tz_and_format(_timezone, '')
427
+ return f'QUARTER({column},{_timezone})'
376
428
 
377
- return _DtAccessor.Formatter(self._base_column,
378
- int,
379
- formatter=lambda x: f'QUARTER({x},{timezone})')
429
+ return _DtAccessor.Formatter(
430
+ op_params=[self._base_column, timezone],
431
+ dtype=int,
432
+ formatter=formatter,
433
+ )
380
434
 
381
435
  @docstring(parameters=[_timezone_doc], add_self=True)
382
436
  def year(self, timezone=None):
@@ -398,11 +452,16 @@ class _DtAccessor(_Accessor):
398
452
  6 2029-03-01 2029
399
453
  7 2030-03-01 2030
400
454
  """
401
- timezone, _ = self._preprocess_tz_and_format(timezone, '')
455
+ def formatter(column, _timezone):
456
+ column = ott.value2str(column)
457
+ _timezone, _ = self._preprocess_tz_and_format(_timezone, '')
458
+ return f'YEAR({column},{_timezone})'
402
459
 
403
- return _DtAccessor.Formatter(self._base_column,
404
- int,
405
- formatter=lambda x: f'YEAR({x},{timezone})')
460
+ return _DtAccessor.Formatter(
461
+ op_params=[self._base_column, timezone],
462
+ dtype=int,
463
+ formatter=formatter,
464
+ )
406
465
 
407
466
  @docstring(parameters=[_timezone_doc], add_self=True)
408
467
  def date_trunc(self,
@@ -434,12 +493,17 @@ class _DtAccessor(_Accessor):
434
493
  5 2020-11-11 05:04:13.101737879 2020-11-11 05:04:13.101000000 millisecond
435
494
  6 2020-11-11 05:04:13.101737879 2020-11-11 05:04:13.101737879 nanosecond
436
495
  """
437
- timezone, _ = self._preprocess_tz_and_format(timezone, '')
438
- date_part = value2str(date_part)
439
-
440
- return _DtAccessor.Formatter(self._base_column,
441
- datetime,
442
- formatter=lambda x: f'DATE_TRUNC({date_part},{x},{timezone})')
496
+ def formatter(column, _date_part, _timezone):
497
+ column = ott.value2str(column)
498
+ _timezone, _ = self._preprocess_tz_and_format(_timezone, '')
499
+ _date_part = value2str(_date_part)
500
+ return f'DATE_TRUNC({_date_part},{column},{_timezone})'
501
+
502
+ return _DtAccessor.Formatter(
503
+ op_params=[self._base_column, date_part, timezone],
504
+ dtype=datetime,
505
+ formatter=formatter,
506
+ )
443
507
 
444
508
  @docstring(parameters=[_timezone_doc], add_self=True)
445
509
  def week(self, timezone=None):
@@ -461,8 +525,13 @@ class _DtAccessor(_Accessor):
461
525
  6 2020-09-01 36
462
526
  7 2020-10-01 40
463
527
  """
464
- timezone, _ = self._preprocess_tz_and_format(timezone, '')
465
-
466
- return _DtAccessor.Formatter(self._base_column,
467
- int,
468
- formatter=lambda x: f'WEEK({x},{timezone})')
528
+ def formatter(column, _timezone):
529
+ column = ott.value2str(column)
530
+ _timezone, _ = self._preprocess_tz_and_format(_timezone, '')
531
+ return f'WEEK({column},{_timezone})'
532
+
533
+ return _DtAccessor.Formatter(
534
+ op_params=[self._base_column, timezone],
535
+ dtype=int,
536
+ formatter=formatter,
537
+ )