numdaplot 0.1.0__py3-none-any.whl

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 (474) hide show
  1. numdaplot/__init__.py +506 -0
  2. numdaplot/arrays/__init__.py +5 -0
  3. numdaplot/arrays/array.py +92 -0
  4. numdaplot/arrays/array_arithmetic.py +404 -0
  5. numdaplot/arrays/array_calculation.py +143 -0
  6. numdaplot/arrays/array_conversion.py +150 -0
  7. numdaplot/arrays/array_creation.py +371 -0
  8. numdaplot/arrays/array_data.py +281 -0
  9. numdaplot/arrays/array_layout.py +179 -0
  10. numdaplot/arrays/array_logic.py +227 -0
  11. numdaplot/arrays/array_reflected_arithmetic.py +334 -0
  12. numdaplot/arrays/array_refusals.py +339 -0
  13. numdaplot/arrays/array_selection.py +195 -0
  14. numdaplot/arrays/array_sorting.py +59 -0
  15. numdaplot/arrays/axis_number.py +58 -0
  16. numdaplot/arrays/calculation/__init__.py +5 -0
  17. numdaplot/arrays/calculation/counting_statistics.py +325 -0
  18. numdaplot/arrays/calculation/location_statistics.py +268 -0
  19. numdaplot/arrays/calculation/math_function_values.py +183 -0
  20. numdaplot/arrays/calculation/statistic_values.py +209 -0
  21. numdaplot/arrays/calculation/time_function_values.py +419 -0
  22. numdaplot/arrays/conversion/__init__.py +5 -0
  23. numdaplot/arrays/conversion/array_text.py +62 -0
  24. numdaplot/arrays/conversion/equality_check.py +72 -0
  25. numdaplot/arrays/conversion/python_values.py +70 -0
  26. numdaplot/arrays/conversion/time_text.py +290 -0
  27. numdaplot/arrays/creation/__init__.py +5 -0
  28. numdaplot/arrays/creation/date_parts.py +89 -0
  29. numdaplot/arrays/creation/date_parts_values.py +437 -0
  30. numdaplot/arrays/creation/distribution.py +54 -0
  31. numdaplot/arrays/creation/filled_values.py +58 -0
  32. numdaplot/arrays/creation/list_conversion.py +311 -0
  33. numdaplot/arrays/creation/list_shape.py +97 -0
  34. numdaplot/arrays/creation/normal.py +65 -0
  35. numdaplot/arrays/creation/numpy_conversion.py +149 -0
  36. numdaplot/arrays/creation/random_integers.py +104 -0
  37. numdaplot/arrays/creation/random_values.py +97 -0
  38. numdaplot/arrays/creation/range_values.py +73 -0
  39. numdaplot/arrays/creation/spacing.py +84 -0
  40. numdaplot/arrays/creation/spacing_values.py +63 -0
  41. numdaplot/arrays/creation/uniform.py +63 -0
  42. numdaplot/arrays/equality.py +68 -0
  43. numdaplot/arrays/layout/__init__.py +5 -0
  44. numdaplot/arrays/layout/sorting_values.py +113 -0
  45. numdaplot/arrays/layout/unique_values.py +49 -0
  46. numdaplot/arrays/mapping/__init__.py +5 -0
  47. numdaplot/arrays/mapping/mapped_values.py +286 -0
  48. numdaplot/arrays/mapping/unmatched.py +50 -0
  49. numdaplot/arrays/mapping/value_change.py +55 -0
  50. numdaplot/arrays/mapping/value_mapping.py +161 -0
  51. numdaplot/arrays/math_functions/__init__.py +5 -0
  52. numdaplot/arrays/math_functions/absolute.py +27 -0
  53. numdaplot/arrays/math_functions/cosine.py +28 -0
  54. numdaplot/arrays/math_functions/exponential.py +27 -0
  55. numdaplot/arrays/math_functions/logarithm.py +72 -0
  56. numdaplot/arrays/math_functions/math_function.py +58 -0
  57. numdaplot/arrays/math_functions/round.py +58 -0
  58. numdaplot/arrays/math_functions/sine.py +28 -0
  59. numdaplot/arrays/math_functions/square_root.py +27 -0
  60. numdaplot/arrays/operations/__init__.py +5 -0
  61. numdaplot/arrays/operations/boolean_operands.py +48 -0
  62. numdaplot/arrays/operations/combination.py +157 -0
  63. numdaplot/arrays/operations/float_errors.py +170 -0
  64. numdaplot/arrays/operations/integer_bounds.py +175 -0
  65. numdaplot/arrays/operations/integer_rules.py +397 -0
  66. numdaplot/arrays/operations/operand.py +139 -0
  67. numdaplot/arrays/operations/time_arithmetic.py +479 -0
  68. numdaplot/arrays/operations/time_bounds.py +286 -0
  69. numdaplot/arrays/operations/time_result_bounds.py +397 -0
  70. numdaplot/arrays/operations/transformation.py +54 -0
  71. numdaplot/arrays/operations/type_requirements.py +94 -0
  72. numdaplot/arrays/replacement.py +66 -0
  73. numdaplot/arrays/selection/__init__.py +5 -0
  74. numdaplot/arrays/selection/comparison_masks.py +131 -0
  75. numdaplot/arrays/selection/membership_masks.py +118 -0
  76. numdaplot/arrays/selection/missing_mask.py +50 -0
  77. numdaplot/arrays/selection/region_index.py +178 -0
  78. numdaplot/arrays/selection/replaced_values.py +120 -0
  79. numdaplot/arrays/selection/rule_mask.py +83 -0
  80. numdaplot/arrays/selection/time_reference.py +172 -0
  81. numdaplot/arrays/shape.py +74 -0
  82. numdaplot/arrays/type_match.py +51 -0
  83. numdaplot/data_types/__init__.py +5 -0
  84. numdaplot/data_types/library.py +57 -0
  85. numdaplot/data_types/numpy_mapping.py +207 -0
  86. numdaplot/data_types/pandas_mapping.py +114 -0
  87. numdaplot/data_types/time_of_day.py +292 -0
  88. numdaplot/data_types/type.py +224 -0
  89. numdaplot/data_types/value_family.py +149 -0
  90. numdaplot/data_types/value_type.py +147 -0
  91. numdaplot/dates/__init__.py +5 -0
  92. numdaplot/dates/custom_date_format.py +83 -0
  93. numdaplot/dates/date_format.py +120 -0
  94. numdaplot/dates/date_part.py +59 -0
  95. numdaplot/dates/date_part_unit.py +153 -0
  96. numdaplot/dates/date_period.py +57 -0
  97. numdaplot/dates/duration_in.py +58 -0
  98. numdaplot/dates/duration_unit.py +90 -0
  99. numdaplot/dates/period_unit.py +101 -0
  100. numdaplot/dates/time_function.py +56 -0
  101. numdaplot/dates/time_zone.py +68 -0
  102. numdaplot/dates/time_zone_change.py +71 -0
  103. numdaplot/dates/time_zone_mode.py +81 -0
  104. numdaplot/dates/to_duration.py +58 -0
  105. numdaplot/errors/__init__.py +7 -0
  106. numdaplot/errors/broadcast_warning.py +36 -0
  107. numdaplot/errors/calculation_warning.py +35 -0
  108. numdaplot/errors/cell_out_of_range_error.py +77 -0
  109. numdaplot/errors/column_not_found_error.py +64 -0
  110. numdaplot/errors/conflicting_settings_error.py +60 -0
  111. numdaplot/errors/dimension_error.py +62 -0
  112. numdaplot/errors/display_warning.py +32 -0
  113. numdaplot/errors/duplicate_column_error.py +82 -0
  114. numdaplot/errors/duplicate_label_error.py +55 -0
  115. numdaplot/errors/duplicate_statistic_error.py +55 -0
  116. numdaplot/errors/duplicate_value_error.py +54 -0
  117. numdaplot/errors/empty_array_error.py +55 -0
  118. numdaplot/errors/empty_list_error.py +52 -0
  119. numdaplot/errors/empty_region_error.py +34 -0
  120. numdaplot/errors/empty_text_error.py +34 -0
  121. numdaplot/errors/empty_total_error.py +62 -0
  122. numdaplot/errors/empty_values_error.py +34 -0
  123. numdaplot/errors/file_access_error.py +70 -0
  124. numdaplot/errors/file_exists_error.py +62 -0
  125. numdaplot/errors/file_not_found_error.py +56 -0
  126. numdaplot/errors/incompatible_charts_error.py +80 -0
  127. numdaplot/errors/incompatible_types_error.py +104 -0
  128. numdaplot/errors/integer_overflow_error.py +61 -0
  129. numdaplot/errors/invalid_base_error.py +52 -0
  130. numdaplot/errors/invalid_bin_width_error.py +66 -0
  131. numdaplot/errors/invalid_bounds_error.py +58 -0
  132. numdaplot/errors/invalid_chart_data_error.py +81 -0
  133. numdaplot/errors/invalid_color_count_error.py +63 -0
  134. numdaplot/errors/invalid_color_error.py +51 -0
  135. numdaplot/errors/invalid_column_name_error.py +52 -0
  136. numdaplot/errors/invalid_conversion_error.py +119 -0
  137. numdaplot/errors/invalid_count_error.py +61 -0
  138. numdaplot/errors/invalid_date_format_error.py +51 -0
  139. numdaplot/errors/invalid_deviation_error.py +52 -0
  140. numdaplot/errors/invalid_fraction_error.py +51 -0
  141. numdaplot/errors/invalid_label_count_error.py +61 -0
  142. numdaplot/errors/invalid_limits_error.py +111 -0
  143. numdaplot/errors/invalid_opacity_error.py +52 -0
  144. numdaplot/errors/invalid_point_size_error.py +52 -0
  145. numdaplot/errors/invalid_position_error.py +106 -0
  146. numdaplot/errors/invalid_resolution_error.py +51 -0
  147. numdaplot/errors/invalid_rotation_error.py +53 -0
  148. numdaplot/errors/invalid_seed_error.py +53 -0
  149. numdaplot/errors/invalid_separator_error.py +52 -0
  150. numdaplot/errors/invalid_shape_error.py +52 -0
  151. numdaplot/errors/invalid_sheet_name_error.py +54 -0
  152. numdaplot/errors/invalid_size_error.py +58 -0
  153. numdaplot/errors/invalid_step_error.py +77 -0
  154. numdaplot/errors/invalid_suffixes_error.py +61 -0
  155. numdaplot/errors/invalid_time_zone_change_error.py +63 -0
  156. numdaplot/errors/invalid_type_error.py +79 -0
  157. numdaplot/errors/irregular_list_error.py +36 -0
  158. numdaplot/errors/join_relation_error.py +183 -0
  159. numdaplot/errors/missing_dependency_error.py +58 -0
  160. numdaplot/errors/missing_type_error.py +36 -0
  161. numdaplot/errors/missing_value_error.py +62 -0
  162. numdaplot/errors/not_single_value_error.py +53 -0
  163. numdaplot/errors/numdaplot_error.py +25 -0
  164. numdaplot/errors/numdaplot_warning.py +34 -0
  165. numdaplot/errors/occupied_cell_error.py +63 -0
  166. numdaplot/errors/out_of_domain_error.py +70 -0
  167. numdaplot/errors/readability_warning.py +35 -0
  168. numdaplot/errors/refused_operation_error.py +64 -0
  169. numdaplot/errors/refused_setting_error.py +60 -0
  170. numdaplot/errors/rejected_dates.py +60 -0
  171. numdaplot/errors/repeated_key.py +36 -0
  172. numdaplot/errors/shape_mismatch_error.py +67 -0
  173. numdaplot/errors/time_overflow_error.py +131 -0
  174. numdaplot/errors/time_zone_mismatch_error.py +83 -0
  175. numdaplot/errors/unknown_time_zone_error.py +51 -0
  176. numdaplot/errors/unmatched_value_error.py +81 -0
  177. numdaplot/errors/unsupported_image_format_error.py +56 -0
  178. numdaplot/errors/unsupported_index_error.py +38 -0
  179. numdaplot/errors/unsupported_missing_error.py +129 -0
  180. numdaplot/errors/unsupported_type_error.py +62 -0
  181. numdaplot/errors/value_conversion_error.py +215 -0
  182. numdaplot/ordering/__init__.py +5 -0
  183. numdaplot/ordering/missing_position.py +46 -0
  184. numdaplot/ordering/order.py +46 -0
  185. numdaplot/package_version.py +36 -0
  186. numdaplot/plots/__init__.py +5 -0
  187. numdaplot/plots/chart_layer.py +47 -0
  188. numdaplot/plots/charts/__init__.py +5 -0
  189. numdaplot/plots/charts/bar_chart.py +98 -0
  190. numdaplot/plots/charts/bar_layout.py +58 -0
  191. numdaplot/plots/charts/bin_count.py +61 -0
  192. numdaplot/plots/charts/bin_width.py +78 -0
  193. numdaplot/plots/charts/box_chart.py +97 -0
  194. numdaplot/plots/charts/cell_values.py +61 -0
  195. numdaplot/plots/charts/chart.py +59 -0
  196. numdaplot/plots/charts/chart_settings.py +105 -0
  197. numdaplot/plots/charts/color_scale.py +147 -0
  198. numdaplot/plots/charts/heatmap_chart.py +92 -0
  199. numdaplot/plots/charts/histogram_chart.py +93 -0
  200. numdaplot/plots/charts/line_chart.py +100 -0
  201. numdaplot/plots/charts/line_type.py +75 -0
  202. numdaplot/plots/charts/marker_shape.py +113 -0
  203. numdaplot/plots/charts/missing_chart.py +60 -0
  204. numdaplot/plots/charts/missing_map_chart.py +27 -0
  205. numdaplot/plots/charts/orientation.py +58 -0
  206. numdaplot/plots/charts/outliers.py +49 -0
  207. numdaplot/plots/charts/percentages.py +55 -0
  208. numdaplot/plots/charts/pie_chart.py +87 -0
  209. numdaplot/plots/charts/scatter_chart.py +159 -0
  210. numdaplot/plots/charts/value_axis.py +66 -0
  211. numdaplot/plots/data/__init__.py +5 -0
  212. numdaplot/plots/data/array_values.py +128 -0
  213. numdaplot/plots/data/chart_data.py +143 -0
  214. numdaplot/plots/data/chart_values.py +109 -0
  215. numdaplot/plots/data/column_reading.py +468 -0
  216. numdaplot/plots/data/heatmap_values.py +63 -0
  217. numdaplot/plots/data/missing_cells.py +165 -0
  218. numdaplot/plots/data/pie_values.py +215 -0
  219. numdaplot/plots/data/point_values.py +249 -0
  220. numdaplot/plots/data/position_kind.py +83 -0
  221. numdaplot/plots/data/renamed_layers.py +340 -0
  222. numdaplot/plots/data/sample_values.py +160 -0
  223. numdaplot/plots/data/shown_columns.py +248 -0
  224. numdaplot/plots/data/table_values.py +256 -0
  225. numdaplot/plots/data/unique_labels.py +45 -0
  226. numdaplot/plots/drawing/__init__.py +5 -0
  227. numdaplot/plots/drawing/bar_drawing.py +316 -0
  228. numdaplot/plots/drawing/box_drawing.py +344 -0
  229. numdaplot/plots/drawing/cell_merging.py +237 -0
  230. numdaplot/plots/drawing/chart_texts.py +124 -0
  231. numdaplot/plots/drawing/color_bar.py +57 -0
  232. numdaplot/plots/drawing/color_scale_values.py +120 -0
  233. numdaplot/plots/drawing/default_labels.py +41 -0
  234. numdaplot/plots/drawing/drawn_chart.py +50 -0
  235. numdaplot/plots/drawing/grid_axes.py +75 -0
  236. numdaplot/plots/drawing/heatmap_drawing.py +313 -0
  237. numdaplot/plots/drawing/histogram_drawing.py +350 -0
  238. numdaplot/plots/drawing/label_room.py +344 -0
  239. numdaplot/plots/drawing/label_thinning.py +216 -0
  240. numdaplot/plots/drawing/layer_alignment.py +319 -0
  241. numdaplot/plots/drawing/layer_colors.py +123 -0
  242. numdaplot/plots/drawing/line_drawing.py +85 -0
  243. numdaplot/plots/drawing/marker_codes.py +20 -0
  244. numdaplot/plots/drawing/missing_drawing.py +360 -0
  245. numdaplot/plots/drawing/moment_period_formatter.py +253 -0
  246. numdaplot/plots/drawing/pie_drawing.py +185 -0
  247. numdaplot/plots/drawing/plot_axes.py +38 -0
  248. numdaplot/plots/drawing/plot_drawing.py +288 -0
  249. numdaplot/plots/drawing/plot_theme.py +45 -0
  250. numdaplot/plots/drawing/position_axis.py +278 -0
  251. numdaplot/plots/drawing/scatter_drawing.py +364 -0
  252. numdaplot/plots/drawing/series_colors.py +177 -0
  253. numdaplot/plots/drawing/size_inches.py +45 -0
  254. numdaplot/plots/drawing/style_drawing.py +410 -0
  255. numdaplot/plots/drawing/text_contrast.py +44 -0
  256. numdaplot/plots/drawing/tick_rotation.py +354 -0
  257. numdaplot/plots/drawing/time_axis.py +212 -0
  258. numdaplot/plots/drawing/whole_numbers.py +72 -0
  259. numdaplot/plots/figure/__init__.py +5 -0
  260. numdaplot/plots/figure/cell.py +95 -0
  261. numdaplot/plots/figure/figure.py +256 -0
  262. numdaplot/plots/figure/figure_drawing.py +99 -0
  263. numdaplot/plots/figure/figure_style.py +60 -0
  264. numdaplot/plots/figure/layout.py +71 -0
  265. numdaplot/plots/figure/placement.py +150 -0
  266. numdaplot/plots/layer_reading.py +166 -0
  267. numdaplot/plots/output/__init__.py +5 -0
  268. numdaplot/plots/output/image_saving.py +187 -0
  269. numdaplot/plots/output/plot_display.py +181 -0
  270. numdaplot/plots/output/shown_object.py +45 -0
  271. numdaplot/plots/overlay_checks.py +245 -0
  272. numdaplot/plots/plot.py +31 -0
  273. numdaplot/plots/plot_data.py +140 -0
  274. numdaplot/plots/plot_distribution_creation.py +237 -0
  275. numdaplot/plots/plot_output.py +124 -0
  276. numdaplot/plots/plot_overlays.py +273 -0
  277. numdaplot/plots/plot_overview_creation.py +195 -0
  278. numdaplot/plots/plot_series_creation.py +213 -0
  279. numdaplot/plots/style/__init__.py +5 -0
  280. numdaplot/plots/style/axis_settings.py +60 -0
  281. numdaplot/plots/style/color.py +168 -0
  282. numdaplot/plots/style/custom_color.py +65 -0
  283. numdaplot/plots/style/grid_lines.py +49 -0
  284. numdaplot/plots/style/image_options.py +71 -0
  285. numdaplot/plots/style/legend_position.py +149 -0
  286. numdaplot/plots/style/plot_style.py +136 -0
  287. numdaplot/plots/style/size.py +70 -0
  288. numdaplot/plots/style/size_unit.py +62 -0
  289. numdaplot/positions/__init__.py +5 -0
  290. numdaplot/positions/axis.py +54 -0
  291. numdaplot/positions/index.py +51 -0
  292. numdaplot/positions/range.py +90 -0
  293. numdaplot/positions/region.py +92 -0
  294. numdaplot/py.typed +0 -0
  295. numdaplot/ratios/__init__.py +5 -0
  296. numdaplot/ratios/fraction.py +40 -0
  297. numdaplot/ratios/measure.py +48 -0
  298. numdaplot/rules/__init__.py +5 -0
  299. numdaplot/rules/between.py +78 -0
  300. numdaplot/rules/bounds.py +83 -0
  301. numdaplot/rules/case.py +48 -0
  302. numdaplot/rules/contains.py +63 -0
  303. numdaplot/rules/equal.py +43 -0
  304. numdaplot/rules/greater.py +39 -0
  305. numdaplot/rules/greater_or_equal.py +38 -0
  306. numdaplot/rules/is_in.py +67 -0
  307. numdaplot/rules/is_missing.py +25 -0
  308. numdaplot/rules/is_present.py +25 -0
  309. numdaplot/rules/less.py +39 -0
  310. numdaplot/rules/less_or_equal.py +38 -0
  311. numdaplot/rules/not_equal.py +45 -0
  312. numdaplot/rules/rule.py +62 -0
  313. numdaplot/rules/rule_values.py +44 -0
  314. numdaplot/rules/value_rule.py +110 -0
  315. numdaplot/settings/__init__.py +5 -0
  316. numdaplot/settings/argument_types.py +327 -0
  317. numdaplot/settings/field_types.py +593 -0
  318. numdaplot/statistics/__init__.py +5 -0
  319. numdaplot/statistics/count.py +71 -0
  320. numdaplot/statistics/count_distinct.py +27 -0
  321. numdaplot/statistics/counted_missing.py +46 -0
  322. numdaplot/statistics/maximum.py +27 -0
  323. numdaplot/statistics/mean.py +27 -0
  324. numdaplot/statistics/median.py +27 -0
  325. numdaplot/statistics/minimum.py +27 -0
  326. numdaplot/statistics/most_frequent.py +27 -0
  327. numdaplot/statistics/most_frequent_count.py +27 -0
  328. numdaplot/statistics/quantile.py +61 -0
  329. numdaplot/statistics/standard_deviation.py +29 -0
  330. numdaplot/statistics/statistic.py +63 -0
  331. numdaplot/statistics/sum.py +27 -0
  332. numdaplot/tables/__init__.py +5 -0
  333. numdaplot/tables/aggregation/__init__.py +5 -0
  334. numdaplot/tables/aggregation/aggregated_frame.py +189 -0
  335. numdaplot/tables/aggregation/aggregation.py +97 -0
  336. numdaplot/tables/aggregation/calculation.py +123 -0
  337. numdaplot/tables/aggregation/result_column.py +108 -0
  338. numdaplot/tables/aggregation/row_groups.py +96 -0
  339. numdaplot/tables/aggregation/statistic_name.py +122 -0
  340. numdaplot/tables/columns/__init__.py +5 -0
  341. numdaplot/tables/columns/added_column.py +89 -0
  342. numdaplot/tables/columns/boolean_conversion.py +144 -0
  343. numdaplot/tables/columns/boolean_rule.py +59 -0
  344. numdaplot/tables/columns/bracket_end.py +50 -0
  345. numdaplot/tables/columns/bracket_names.py +346 -0
  346. numdaplot/tables/columns/bracketed_column.py +179 -0
  347. numdaplot/tables/columns/brackets.py +234 -0
  348. numdaplot/tables/columns/chosen_columns.py +55 -0
  349. numdaplot/tables/columns/column_choice.py +84 -0
  350. numdaplot/tables/columns/column_mode.py +64 -0
  351. numdaplot/tables/columns/column_names.py +186 -0
  352. numdaplot/tables/columns/conversion.py +103 -0
  353. numdaplot/tables/columns/converted_column.py +669 -0
  354. numdaplot/tables/columns/date_conversion.py +526 -0
  355. numdaplot/tables/columns/date_range.py +135 -0
  356. numdaplot/tables/columns/name_change.py +67 -0
  357. numdaplot/tables/columns/new_column.py +79 -0
  358. numdaplot/tables/columns/number_conversion.py +281 -0
  359. numdaplot/tables/columns/renamed_columns.py +60 -0
  360. numdaplot/tables/columns/renaming.py +81 -0
  361. numdaplot/tables/columns/text_conversion.py +70 -0
  362. numdaplot/tables/columns/time_conversion.py +313 -0
  363. numdaplot/tables/columns/time_zone_conversion.py +128 -0
  364. numdaplot/tables/conflict.py +68 -0
  365. numdaplot/tables/description/__init__.py +5 -0
  366. numdaplot/tables/description/described_frame.py +335 -0
  367. numdaplot/tables/description/description.py +155 -0
  368. numdaplot/tables/duplicates/__init__.py +5 -0
  369. numdaplot/tables/duplicates/deduplicated_frame.py +66 -0
  370. numdaplot/tables/duplicates/deduplication.py +88 -0
  371. numdaplot/tables/duplicates/keep.py +81 -0
  372. numdaplot/tables/files/__init__.py +5 -0
  373. numdaplot/tables/files/column_names.py +60 -0
  374. numdaplot/tables/files/csv_file.py +265 -0
  375. numdaplot/tables/files/csv_read_options.py +89 -0
  376. numdaplot/tables/files/csv_separator.py +41 -0
  377. numdaplot/tables/files/csv_write_options.py +79 -0
  378. numdaplot/tables/files/decimal_count.py +42 -0
  379. numdaplot/tables/files/encoding.py +82 -0
  380. numdaplot/tables/files/excel_file.py +171 -0
  381. numdaplot/tables/files/excel_read_options.py +79 -0
  382. numdaplot/tables/files/excel_sheet.py +50 -0
  383. numdaplot/tables/files/excel_time_cells.py +146 -0
  384. numdaplot/tables/files/excel_write_options.py +63 -0
  385. numdaplot/tables/files/file_access.py +152 -0
  386. numdaplot/tables/files/file_paths.py +106 -0
  387. numdaplot/tables/files/json_decimals.py +387 -0
  388. numdaplot/tables/files/json_file.py +203 -0
  389. numdaplot/tables/files/json_layout.py +63 -0
  390. numdaplot/tables/files/json_read_options.py +64 -0
  391. numdaplot/tables/files/json_write_options.py +71 -0
  392. numdaplot/tables/files/missing_texts.py +63 -0
  393. numdaplot/tables/files/optional_package.py +42 -0
  394. numdaplot/tables/files/pandas_backend.py +11 -0
  395. numdaplot/tables/files/parquet_file.py +91 -0
  396. numdaplot/tables/files/parquet_read_options.py +56 -0
  397. numdaplot/tables/files/sas_file.py +94 -0
  398. numdaplot/tables/files/sas_read_options.py +67 -0
  399. numdaplot/tables/files/stata_file.py +83 -0
  400. numdaplot/tables/files/stata_read_options.py +56 -0
  401. numdaplot/tables/files/xpt_read_options.py +65 -0
  402. numdaplot/tables/filtering/__init__.py +5 -0
  403. numdaplot/tables/filtering/checked_frame.py +60 -0
  404. numdaplot/tables/filtering/column_mask.py +71 -0
  405. numdaplot/tables/filtering/column_match.py +62 -0
  406. numdaplot/tables/filtering/condition.py +94 -0
  407. numdaplot/tables/filtering/filter.py +74 -0
  408. numdaplot/tables/filtering/filter_mode.py +67 -0
  409. numdaplot/tables/filtering/row_mask.py +152 -0
  410. numdaplot/tables/filtering/rule_moments.py +164 -0
  411. numdaplot/tables/frames/__init__.py +5 -0
  412. numdaplot/tables/frames/array_frame.py +95 -0
  413. numdaplot/tables/frames/cleaned_names.py +132 -0
  414. numdaplot/tables/frames/column.py +15 -0
  415. numdaplot/tables/frames/column_values.py +273 -0
  416. numdaplot/tables/frames/frame_equality.py +130 -0
  417. numdaplot/tables/frames/frame_normalization.py +459 -0
  418. numdaplot/tables/frames/named_column_errors.py +85 -0
  419. numdaplot/tables/frames/pandas_decimals.py +113 -0
  420. numdaplot/tables/frames/region_positions.py +113 -0
  421. numdaplot/tables/frames/table_text.py +222 -0
  422. numdaplot/tables/frames/time_columns.py +345 -0
  423. numdaplot/tables/frames/time_range_errors.py +117 -0
  424. numdaplot/tables/frames/time_zones.py +271 -0
  425. numdaplot/tables/joining/__init__.py +5 -0
  426. numdaplot/tables/joining/join.py +110 -0
  427. numdaplot/tables/joining/join_keys.py +367 -0
  428. numdaplot/tables/joining/join_mode.py +93 -0
  429. numdaplot/tables/joining/join_relation.py +149 -0
  430. numdaplot/tables/joining/join_suffixes.py +71 -0
  431. numdaplot/tables/joining/joined_frame.py +166 -0
  432. numdaplot/tables/joining/joined_names.py +107 -0
  433. numdaplot/tables/joining/joined_rows.py +235 -0
  434. numdaplot/tables/joining/key_types.py +57 -0
  435. numdaplot/tables/joining/relation.py +78 -0
  436. numdaplot/tables/missing/__init__.py +5 -0
  437. numdaplot/tables/missing/missing_count.py +59 -0
  438. numdaplot/tables/missing/missing_counts.py +214 -0
  439. numdaplot/tables/missing/missing_drop.py +98 -0
  440. numdaplot/tables/missing/missing_mode.py +63 -0
  441. numdaplot/tables/missing/missing_ratio.py +71 -0
  442. numdaplot/tables/missing/missing_removal.py +257 -0
  443. numdaplot/tables/missing/missing_summary.py +174 -0
  444. numdaplot/tables/missing/ratio_comparison.py +70 -0
  445. numdaplot/tables/pivot/__init__.py +5 -0
  446. numdaplot/tables/pivot/pivot_table.py +104 -0
  447. numdaplot/tables/pivot/pivoted_frame.py +244 -0
  448. numdaplot/tables/preview/__init__.py +5 -0
  449. numdaplot/tables/preview/notebook_display.py +238 -0
  450. numdaplot/tables/preview/preview.py +100 -0
  451. numdaplot/tables/preview/preview_rows.py +55 -0
  452. numdaplot/tables/preview/shown_columns.py +62 -0
  453. numdaplot/tables/preview/side.py +82 -0
  454. numdaplot/tables/sorting/__init__.py +5 -0
  455. numdaplot/tables/sorting/sort_key.py +71 -0
  456. numdaplot/tables/sorting/sorted_frame.py +81 -0
  457. numdaplot/tables/sorting/sorting.py +82 -0
  458. numdaplot/tables/table.py +71 -0
  459. numdaplot/tables/table_calculation.py +172 -0
  460. numdaplot/tables/table_columns.py +214 -0
  461. numdaplot/tables/table_conversion.py +351 -0
  462. numdaplot/tables/table_data.py +321 -0
  463. numdaplot/tables/table_display.py +56 -0
  464. numdaplot/tables/table_joining.py +80 -0
  465. numdaplot/tables/table_layout.py +105 -0
  466. numdaplot/tables/table_missing.py +146 -0
  467. numdaplot/tables/table_reading.py +451 -0
  468. numdaplot/tables/table_refusals.py +295 -0
  469. numdaplot/tables/table_selection.py +163 -0
  470. numdaplot/tables/table_writing.py +269 -0
  471. numdaplot-0.1.0.dist-info/METADATA +176 -0
  472. numdaplot-0.1.0.dist-info/RECORD +474 -0
  473. numdaplot-0.1.0.dist-info/WHEEL +4 -0
  474. numdaplot-0.1.0.dist-info/licenses/LICENSE +28 -0
@@ -0,0 +1,207 @@
1
+ """
2
+ Conversion between ``ndp.Type`` and numpy dtypes, used by Array.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from typing import Any, cast
8
+
9
+ import numpy
10
+
11
+ from numdaplot.data_types.library import Library
12
+ from numdaplot.data_types.type import Type
13
+ from numdaplot.errors.unsupported_type_error import UnsupportedTypeError
14
+
15
+ # Some versions of the numpy stubs leave out the missing value marker of StringDType.
16
+ STRING_DTYPE_CLASS = cast(Any, numpy.dtypes.StringDType)
17
+ TEXT_DTYPE = STRING_DTYPE_CLASS(na_object=numpy.nan)
18
+ NUMPY_DTYPE_CODES = {
19
+ Type.INT8: "int8",
20
+ Type.INT16: "int16",
21
+ Type.INT32: "int32",
22
+ Type.INT64: "int64",
23
+ Type.UINT8: "uint8",
24
+ Type.UINT16: "uint16",
25
+ Type.UINT32: "uint32",
26
+ Type.UINT64: "uint64",
27
+ Type.FLOAT32: "float32",
28
+ Type.FLOAT64: "float64",
29
+ Type.BOOL: "bool",
30
+ Type.DATE: "datetime64[D]",
31
+ Type.DATETIME: "datetime64[ns]",
32
+ Type.DURATION: "timedelta64[ns]",
33
+ Type.TIME: "timedelta64[us]",
34
+ }
35
+ NAMED_NUMPY_TYPES = (
36
+ Type.INT8,
37
+ Type.INT16,
38
+ Type.INT32,
39
+ Type.INT64,
40
+ Type.UINT8,
41
+ Type.UINT16,
42
+ Type.UINT32,
43
+ Type.UINT64,
44
+ Type.FLOAT32,
45
+ Type.FLOAT64,
46
+ Type.BOOL,
47
+ )
48
+ TYPES_BY_DTYPE_NAME = {NUMPY_DTYPE_CODES[data_type]: data_type for data_type in NAMED_NUMPY_TYPES}
49
+ TEXT_KINDS = frozenset({"U", "T"})
50
+ DATETIME_KIND = "M"
51
+ DURATION_KIND = "m"
52
+ DAY_UNIT = "D"
53
+ TIME_UNIT = "us"
54
+
55
+
56
+ def to_numpy_dtype(data_type: Type) -> numpy.dtype[Any]:
57
+ """
58
+ Return the numpy dtype that stores the values of a numdaplot type.
59
+
60
+ .. versionadded:: 0.1.0
61
+
62
+ Parameters
63
+ ----------
64
+ data_type
65
+ The numdaplot type to convert.
66
+
67
+ Returns
68
+ -------
69
+ numpy.dtype
70
+ The matching numpy dtype. ``TEXT`` gives the variable-length ``StringDType`` with NaN as missing value,
71
+ ``DATE`` gives ``datetime64[D]`` and ``DATETIME`` gives ``datetime64[ns]``.
72
+
73
+ Raises
74
+ ------
75
+ UnsupportedTypeError
76
+ When the type has no numpy equivalent, which is the case of ``CATEGORY``.
77
+
78
+ Examples
79
+ --------
80
+ >>> import numdaplot as ndp
81
+ >>> from numdaplot.data_types.numpy_mapping import to_numpy_dtype
82
+ >>> to_numpy_dtype(ndp.Type.INT32)
83
+ dtype('int32')
84
+ """
85
+ if data_type == Type.TEXT:
86
+ return TEXT_DTYPE
87
+
88
+ if data_type not in NUMPY_DTYPE_CODES:
89
+ raise UnsupportedTypeError(data_type.name, Library.NUMPY)
90
+
91
+ dtype_code = NUMPY_DTYPE_CODES[data_type]
92
+ numpy_dtype = numpy.dtype(dtype_code)
93
+
94
+ return numpy_dtype
95
+
96
+
97
+ def from_numpy_dtype(numpy_dtype: numpy.dtype[Any]) -> Type:
98
+ """
99
+ Return the numdaplot type that matches a numpy dtype.
100
+
101
+ .. versionadded:: 0.1.0
102
+
103
+ Parameters
104
+ ----------
105
+ numpy_dtype
106
+ The numpy dtype to convert. Fixed-length (``<U5``) and variable-length strings both give ``TEXT``.
107
+ ``timedelta64[us]`` gives ``TIME``, the time since midnight, and every other ``timedelta64`` unit gives
108
+ ``DURATION``.
109
+
110
+ Returns
111
+ -------
112
+ Type
113
+ The matching numdaplot type.
114
+
115
+ Raises
116
+ ------
117
+ UnsupportedTypeError
118
+ When numdaplot has no equivalent type, for example complex numbers or Python objects.
119
+
120
+ Examples
121
+ --------
122
+ >>> import numpy
123
+ >>> from numdaplot.data_types.numpy_mapping import from_numpy_dtype
124
+ >>> from_numpy_dtype(numpy.dtype("datetime64[D]"))
125
+ <Type.DATE: 14>
126
+ """
127
+ dtype_name = numpy_dtype.name
128
+ if dtype_name in TYPES_BY_DTYPE_NAME:
129
+ named_type = TYPES_BY_DTYPE_NAME[dtype_name]
130
+ return named_type
131
+
132
+ dtype_kind = numpy_dtype.kind
133
+ if dtype_kind in TEXT_KINDS:
134
+ return Type.TEXT
135
+
136
+ if dtype_kind == DURATION_KIND:
137
+ duration_type = find_duration_type(numpy_dtype)
138
+ return duration_type
139
+
140
+ if dtype_kind == DATETIME_KIND:
141
+ datetime_type = find_datetime_type(numpy_dtype)
142
+ return datetime_type
143
+
144
+ type_name = str(numpy_dtype)
145
+ raise UnsupportedTypeError(type_name, Library.NUMPY)
146
+
147
+
148
+ def find_duration_type(numpy_dtype: numpy.dtype[Any]) -> Type:
149
+ """
150
+ Return the numdaplot type of a ``timedelta64`` dtype.
151
+
152
+ numdaplot stores a time of day as the time since midnight in microseconds, and every duration in another unit.
153
+
154
+ .. versionadded:: 0.1.0
155
+
156
+ Parameters
157
+ ----------
158
+ numpy_dtype
159
+ A ``timedelta64`` dtype.
160
+
161
+ Returns
162
+ -------
163
+ Type
164
+ ``TIME`` for microseconds, ``DURATION`` otherwise.
165
+
166
+ Examples
167
+ --------
168
+ >>> import numpy
169
+ >>> from numdaplot.data_types.numpy_mapping import find_duration_type
170
+ >>> find_duration_type(numpy.dtype("timedelta64[us]")), find_duration_type(numpy.dtype("timedelta64[s]"))
171
+ (<Type.TIME: 17>, <Type.DURATION: 16>)
172
+ """
173
+ unit, _ = numpy.datetime_data(numpy_dtype)
174
+ if unit == TIME_UNIT:
175
+ return Type.TIME
176
+
177
+ return Type.DURATION
178
+
179
+
180
+ def find_datetime_type(numpy_dtype: numpy.dtype[Any]) -> Type:
181
+ """
182
+ Return the numdaplot type of a ``datetime64`` dtype, according to its unit.
183
+
184
+ .. versionadded:: 0.1.0
185
+
186
+ Parameters
187
+ ----------
188
+ numpy_dtype
189
+ A ``datetime64`` dtype.
190
+
191
+ Returns
192
+ -------
193
+ Type
194
+ ``DATE`` when the unit is the day, ``DATETIME`` for any other unit.
195
+
196
+ Examples
197
+ --------
198
+ >>> import numpy
199
+ >>> from numdaplot.data_types.numpy_mapping import find_datetime_type
200
+ >>> find_datetime_type(numpy.dtype("datetime64[s]"))
201
+ <Type.DATETIME: 15>
202
+ """
203
+ datetime_unit, _ = numpy.datetime_data(numpy_dtype)
204
+ if datetime_unit == DAY_UNIT:
205
+ return Type.DATE
206
+
207
+ return Type.DATETIME
@@ -0,0 +1,114 @@
1
+ """
2
+ Conversion between ``ndp.Type`` and the pandas dtypes that store Table columns.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from typing import Any
8
+
9
+ import numpy
10
+ from pandas import DatetimeTZDtype
11
+ from pandas.api.extensions import ExtensionDtype
12
+ from pandas.api.types import pandas_dtype
13
+
14
+ from numdaplot.data_types.library import Library
15
+ from numdaplot.data_types.type import Type
16
+ from numdaplot.errors.unsupported_type_error import UnsupportedTypeError
17
+
18
+ PANDAS_DTYPE_CODES = {
19
+ Type.INT8: "Int8",
20
+ Type.INT16: "Int16",
21
+ Type.INT32: "Int32",
22
+ Type.INT64: "Int64",
23
+ Type.UINT8: "UInt8",
24
+ Type.UINT16: "UInt16",
25
+ Type.UINT32: "UInt32",
26
+ Type.UINT64: "UInt64",
27
+ Type.FLOAT32: "float32",
28
+ Type.FLOAT64: "float64",
29
+ Type.BOOL: "boolean",
30
+ Type.TEXT: "string",
31
+ Type.CATEGORY: "category",
32
+ Type.DATE: "datetime64[s]",
33
+ Type.DATETIME: "datetime64[ns]",
34
+ Type.DURATION: "timedelta64[ns]",
35
+ Type.TIME: "timedelta64[us]",
36
+ }
37
+ NANOSECOND_UNIT = "ns"
38
+ TYPES_BY_PANDAS_NAME = {dtype_code: data_type for data_type, dtype_code in PANDAS_DTYPE_CODES.items()}
39
+
40
+
41
+ def to_pandas_dtype(data_type: Type) -> numpy.dtype[Any] | ExtensionDtype:
42
+ """
43
+ Return the pandas dtype that stores a Table column of a numdaplot type.
44
+
45
+ Integers, booleans and text use the pandas types that accept missing values (``pd.NA``),
46
+ so a column keeps its type when it has holes. Decimals keep NaN as missing value.
47
+
48
+ .. versionadded:: 0.1.0
49
+
50
+ Parameters
51
+ ----------
52
+ data_type
53
+ The numdaplot type to convert.
54
+
55
+ Returns
56
+ -------
57
+ numpy.dtype or ExtensionDtype
58
+ The matching pandas dtype. ``DATE`` is stored as ``datetime64[s]``,
59
+ since pandas has no dtype for a day without time.
60
+
61
+ Examples
62
+ --------
63
+ >>> import numdaplot as ndp
64
+ >>> from numdaplot.data_types.pandas_mapping import to_pandas_dtype
65
+ >>> to_pandas_dtype(ndp.Type.INT64)
66
+ Int64Dtype()
67
+ """
68
+ dtype_code = PANDAS_DTYPE_CODES[data_type]
69
+ matching_dtype = pandas_dtype(dtype_code)
70
+
71
+ return matching_dtype
72
+
73
+
74
+ def from_pandas_dtype(pandas_type: object) -> Type:
75
+ """
76
+ Return the numdaplot type of a Table column stored with a pandas dtype.
77
+
78
+ .. versionadded:: 0.1.0
79
+
80
+ Parameters
81
+ ----------
82
+ pandas_type
83
+ The dtype of a Table column, one of the dtypes given by ``to_pandas_dtype``.
84
+
85
+ Returns
86
+ -------
87
+ Type
88
+ The matching numdaplot type. Datetimes with a time zone, counted in nanoseconds, give ``DATETIME``.
89
+
90
+ Raises
91
+ ------
92
+ UnsupportedTypeError
93
+ When the dtype is not one that stores a Table column, such as ``object`` or ``complex128``.
94
+
95
+ Examples
96
+ --------
97
+ >>> import pandas
98
+ >>> from numdaplot.data_types.pandas_mapping import from_pandas_dtype
99
+ >>> from_pandas_dtype(pandas.Int64Dtype())
100
+ <Type.INT64: 4>
101
+ >>> from_pandas_dtype(pandas.DatetimeTZDtype("ns", "Europe/Paris"))
102
+ <Type.DATETIME: 15>
103
+ """
104
+ is_nanosecond_zone = isinstance(pandas_type, DatetimeTZDtype) and pandas_type.unit == NANOSECOND_UNIT
105
+ if is_nanosecond_zone:
106
+ return Type.DATETIME
107
+
108
+ dtype_name = str(pandas_type)
109
+ if dtype_name not in TYPES_BY_PANDAS_NAME:
110
+ raise UnsupportedTypeError(dtype_name, Library.PANDAS)
111
+
112
+ matching_type = TYPES_BY_PANDAS_NAME[dtype_name]
113
+
114
+ return matching_type
@@ -0,0 +1,292 @@
1
+ """
2
+ Conversion between Python times of day and the time since midnight that stores them.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from collections.abc import Sequence
8
+ from datetime import time, timedelta
9
+ from typing import Any, cast
10
+
11
+ import numpy
12
+ from numpy.typing import NDArray
13
+
14
+ TIME_DTYPE = numpy.dtype("timedelta64[us]")
15
+ PYTHON_OBJECT_DTYPE = numpy.dtype(object)
16
+ MISSING_TIME = numpy.timedelta64("NaT", "us")
17
+ MICROSECONDS_PER_SECOND = 1_000_000
18
+ SECONDS_PER_MINUTE = 60
19
+ MINUTES_PER_HOUR = 60
20
+
21
+
22
+ def to_time_since_midnight(time_of_day: time) -> timedelta:
23
+ """
24
+ Return the time elapsed since midnight at a time of day.
25
+
26
+ .. versionadded:: 0.1.0
27
+
28
+ Parameters
29
+ ----------
30
+ time_of_day
31
+ A time without time zone.
32
+
33
+ Returns
34
+ -------
35
+ timedelta
36
+ The duration from midnight to the time.
37
+
38
+ Examples
39
+ --------
40
+ >>> from datetime import time
41
+ >>> from numdaplot.data_types.time_of_day import to_time_since_midnight
42
+ >>> to_time_since_midnight(time(15, 35, 0, 250000))
43
+ datetime.timedelta(seconds=56100, microseconds=250000)
44
+ """
45
+ since_midnight = timedelta(
46
+ hours=time_of_day.hour,
47
+ minutes=time_of_day.minute,
48
+ seconds=time_of_day.second,
49
+ microseconds=time_of_day.microsecond,
50
+ )
51
+
52
+ return since_midnight
53
+
54
+
55
+ def to_time_of_day(microseconds: int) -> time:
56
+ """
57
+ Return the time of day reached a number of microseconds after midnight.
58
+
59
+ .. versionadded:: 0.1.0
60
+
61
+ Parameters
62
+ ----------
63
+ microseconds
64
+ The microseconds since midnight, less than one day.
65
+
66
+ Returns
67
+ -------
68
+ time
69
+ The time of day.
70
+
71
+ Examples
72
+ --------
73
+ >>> from numdaplot.data_types.time_of_day import to_time_of_day
74
+ >>> to_time_of_day(56100250000)
75
+ datetime.time(15, 35, 0, 250000)
76
+ """
77
+ total_seconds, microsecond = divmod(microseconds, MICROSECONDS_PER_SECOND)
78
+ total_minutes, second = divmod(total_seconds, SECONDS_PER_MINUTE)
79
+ hour, minute = divmod(total_minutes, MINUTES_PER_HOUR)
80
+ time_of_day = time(hour, minute, second, microsecond)
81
+
82
+ return time_of_day
83
+
84
+
85
+ def store_times(times: Sequence[object]) -> NDArray[numpy.timedelta64]:
86
+ """
87
+ Return times of day as the time since midnight in microseconds, NaT where missing.
88
+
89
+ .. versionadded:: 0.1.0
90
+
91
+ Parameters
92
+ ----------
93
+ times
94
+ Python times of day, and None or NaT for a missing value.
95
+
96
+ Returns
97
+ -------
98
+ NDArray[numpy.timedelta64]
99
+ The values in ``timedelta64[us]``.
100
+
101
+ Examples
102
+ --------
103
+ >>> from datetime import time
104
+ >>> from numdaplot.data_types.time_of_day import store_times
105
+ >>> store_times([time(0, 0, 1), None])
106
+ array([1000000, 'NaT'], dtype='timedelta64[us]')
107
+ """
108
+ durations = list[object]()
109
+ for value in times:
110
+ duration: object = MISSING_TIME
111
+ if isinstance(value, time):
112
+ duration = to_time_since_midnight(value)
113
+
114
+ durations.append(duration)
115
+
116
+ stored_times = numpy.array(durations, dtype=TIME_DTYPE)
117
+
118
+ return stored_times
119
+
120
+
121
+ def read_times(values: NDArray[Any]) -> list[time | None]:
122
+ """
123
+ Return the Python times of day of values stored as the time since midnight, None where missing.
124
+
125
+ .. versionadded:: 0.1.0
126
+
127
+ Parameters
128
+ ----------
129
+ values
130
+ Values in ``timedelta64[us]``, in one dimension.
131
+
132
+ Returns
133
+ -------
134
+ list[time | None]
135
+ One time of day per value.
136
+
137
+ Examples
138
+ --------
139
+ >>> import numpy
140
+ >>> from numdaplot.data_types.time_of_day import read_times
141
+ >>> read_times(numpy.array([56100000000, "NaT"], dtype="timedelta64[us]"))
142
+ [datetime.time(15, 35), None]
143
+ """
144
+ missing = numpy.isnat(values)
145
+ missing_flags = cast(list[bool], missing.tolist())
146
+ whole_values = values.astype(numpy.int64)
147
+ microsecond_list = cast(list[int], whole_values.tolist())
148
+ times = list[time | None]()
149
+ for microseconds, is_missing in zip(microsecond_list, missing_flags, strict=True):
150
+ if is_missing:
151
+ times.append(None)
152
+ continue
153
+
154
+ time_of_day = to_time_of_day(microseconds)
155
+ times.append(time_of_day)
156
+
157
+ return times
158
+
159
+
160
+ def write_time(time_of_day: time) -> str:
161
+ """
162
+ Return a time of day as a text, with its microseconds only when it has some.
163
+
164
+ .. versionadded:: 0.1.0
165
+
166
+ Parameters
167
+ ----------
168
+ time_of_day
169
+ A time of day.
170
+
171
+ Returns
172
+ -------
173
+ str
174
+ ``15:35:00``, or ``15:35:00.250000`` with microseconds.
175
+
176
+ Examples
177
+ --------
178
+ >>> from datetime import time
179
+ >>> from numdaplot.data_types.time_of_day import write_time
180
+ >>> write_time(time(15, 35)), write_time(time(15, 35, 0, 250000))
181
+ ('15:35:00', '15:35:00.250000')
182
+ """
183
+ time_text = time_of_day.isoformat()
184
+
185
+ return time_text
186
+
187
+
188
+ def read_time_objects(values: NDArray[Any]) -> NDArray[Any]:
189
+ """
190
+ Return values stored as the time since midnight as Python times of day, in the same shape.
191
+
192
+ .. versionadded:: 0.1.0
193
+
194
+ Parameters
195
+ ----------
196
+ values
197
+ Values in ``timedelta64[us]``, of any shape.
198
+
199
+ Returns
200
+ -------
201
+ NDArray
202
+ An object array of ``datetime.time``, None where missing.
203
+
204
+ Examples
205
+ --------
206
+ >>> import numpy
207
+ >>> from numdaplot.data_types.time_of_day import read_time_objects
208
+ >>> read_time_objects(numpy.array([[60000000]], dtype="timedelta64[us]"))
209
+ array([[datetime.time(0, 1)]], dtype=object)
210
+ """
211
+ flat_values = values.ravel()
212
+ times = read_times(flat_values)
213
+ time_count = len(times)
214
+ # Some versions of the numpy stubs refuse Python objects as the values of an object array.
215
+ time_objects = cast(Any, numpy.empty(time_count, dtype=PYTHON_OBJECT_DTYPE))
216
+ time_objects[:] = times
217
+ shaped_objects = time_objects.reshape(values.shape)
218
+
219
+ return shaped_objects
220
+
221
+
222
+ def holds_only_times(values: NDArray[Any]) -> bool:
223
+ """
224
+ Return whether an object array holds Python times of day and missing values only, with at least one time.
225
+
226
+ .. versionadded:: 0.1.0
227
+
228
+ Parameters
229
+ ----------
230
+ values
231
+ A numpy array of any type.
232
+
233
+ Returns
234
+ -------
235
+ bool
236
+ True for an object array of ``datetime.time`` without time zone and None.
237
+
238
+ Examples
239
+ --------
240
+ >>> from datetime import time
241
+ >>> import numpy
242
+ >>> from numdaplot.data_types.time_of_day import holds_only_times
243
+ >>> holds_only_times(numpy.array([time(8), None], dtype=object)), holds_only_times(numpy.array([1, 2]))
244
+ (True, False)
245
+ """
246
+ if values.dtype != PYTHON_OBJECT_DTYPE:
247
+ return False
248
+
249
+ has_time = False
250
+ for value in values.ravel():
251
+ if value is None:
252
+ continue
253
+
254
+ is_naive_time = isinstance(value, time) and value.tzinfo is None
255
+ if not is_naive_time:
256
+ return False
257
+
258
+ has_time = True
259
+
260
+ return has_time
261
+
262
+
263
+ def store_time_objects(values: NDArray[Any]) -> NDArray[numpy.timedelta64]:
264
+ """
265
+ Return an object array of Python times of day as the time since midnight, in the same shape.
266
+
267
+ .. versionadded:: 0.1.0
268
+
269
+ Parameters
270
+ ----------
271
+ values
272
+ An object array of ``datetime.time`` and None.
273
+
274
+ Returns
275
+ -------
276
+ NDArray[numpy.timedelta64]
277
+ The values in ``timedelta64[us]``, NaT where missing.
278
+
279
+ Examples
280
+ --------
281
+ >>> from datetime import time
282
+ >>> import numpy
283
+ >>> from numdaplot.data_types.time_of_day import store_time_objects
284
+ >>> store_time_objects(numpy.array([time(0, 0, 1), None], dtype=object))
285
+ array([1000000, 'NaT'], dtype='timedelta64[us]')
286
+ """
287
+ flat_values = values.ravel()
288
+ value_list = flat_values.tolist()
289
+ stored_times = store_times(value_list)
290
+ shaped_times = stored_times.reshape(values.shape)
291
+
292
+ return shaped_times