{"receipt_id":"agent1-1","seq":1,"branch_id":"agent1","kind":"command","cmd":"git ls-files -z","path":null,"exit_code":0,"stdout_tail":"ake_first.md\u0000docs/reference/janitor.functions/janitor.then.md\u0000docs/reference/janitor.functions/janitor.to_datetime.md\u0000docs/reference/janitor.functions/janitor.transform_column.md\u0000docs/reference/janitor.functions/janitor.transform_columns.md\u0000docs/reference/janitor.functions/janitor.update_where.md\u0000docs/reference/janitor.spark.functions/janitor.spark.clean_names.md\u0000docs/reference/janitor.spark.functions/janitor.spark.update_where.md\u0000docs/reference/janitor.xarray.functions/janitor.xarray.clone_using.md\u0000docs/reference/janitor.xarray.functions/janitor.xarray.convert_datetime_to_number.md\u0000docs/reference/ml.rst\u0000docs/reference/pyspark.rst\u0000docs/reference/xarray.rst\u0000environment-dev.yml\u0000examples/add_column.md\u0000examples/convert_currency.md\u0000examples/data/medium_franchise_raw_table.csv\u0000examples/filter_date.md\u0000examples/limit_column_characters.md\u0000examples/make_currency_column_numeric.md\u0000examples/notebooks/README.rst\u0000examples/notebooks/Row_to_Names.ipynb\u0000examples/notebooks/anime.ipynb\u0000examples/notebooks/bad_values.ipynb\u0000examples/notebooks/bird_call.ipynb\u0000examples/notebooks/board_games.ipynb\u0000examples/notebooks/dirty_data.ipynb\u0000examples/notebooks/dirty_data.xlsx\u0000examples/notebooks/expand_grid.ipynb\u0000examples/notebooks/french_trains.ipynb\u0000examples/notebooks/groupby_agg.ipynb\u0000examples/notebooks/inflating_converting_currency.ipynb\u0000examples/notebooks/medium_franchise.ipynb\u0000examples/notebooks/normalize.ipynb\u0000examples/notebooks/pyjanitor_intro.ipynb\u0000examples/notebooks/sort_naturally.ipynb\u0000examples/notebooks/teacher_pupil.ipynb\u0000examples/notebooks/transform_column.ipynb\u0000examples/round_to_fraction.md\u0000examples/row_to_names.md\u0000examples/then.md\u0000janitor/__init__.py\u0000janitor/biology.py\u0000janitor/chemistry.py\u0000janitor/engineering.py\u0000janitor/errors.py\u0000janitor/finance.py\u0000janitor/functions.py\u0000janitor/io.py\u0000janitor/math.py\u0000janitor/ml.py\u0000janitor/spark/__init__.py\u0000janitor/spark/backend.py\u0000janitor/spark/functions.py\u0000janitor/testing_utils/__init__.py\u0000janitor/testing_utils/date_data.py\u0000janitor/testing_utils/strategies.py\u0000janitor/timeseries.py\u0000janitor/utils.py\u0000janitor/xarray/__init__.py\u0000janitor/xarray/functions.py\u0000nbconvert_config.py\u0000pyproject.toml\u0000pytest.ini\u0000requirements-dev.txt\u0000requirements.txt\u0000scripts/check-autodoc.py\u0000scripts/docker_deploy.sh\u0000setup.py\u0000talks/scipy2019/friends.png\u0000talks/scipy2019/readthedocs.png\u0000talks/scipy2019/slides.ipynb\u0000talks/scipy2019/slides.md\u0000talks/scipy2019/sprints.jpg\u0000talks/scipy2019/twitter-wars.png\u0000tests/biology/test_join_fasta.py\u0000tests/chemistry/test_maccs_keys_fingerprint.py\u0000tests/chemistry/test_molecular_descriptors.py\u0000tests/chemistry/test_morgan_fingerprint.py\u0000tests/chemistry/test_smiles2mol.py\u0000tests/conftest.py\u0000tests/engineering/test_convert_units.py\u0000tests/finance/test_convert_currency.py\u0000tests/finance/test_inflate_currency.py\u0000tests/functions/test_add_column.py\u0000tests/functions/test_add_columns.py\u0000tests/functions/test_bin_numeric.py\u0000tests/functions/test_change_type.py\u0000tests/functions/test_clean_names.py\u0000tests/functions/test_coalesce.py\u0000tests/functions/test_collapse_levels.py\u0000tests/functions/test_concatenate_columns.py\u0000tests/functions/test_convert_excel_date.py\u0000tests/functions/test_convert_matlab_date.py\u0000tests/functions/test_convert_unix_date.py\u0000tests/functions/test_count_cumulative_unique.py\u0000tests/functions/test_data_description.py\u0000tests/functions/test_deconcatenate_column.py\u0000tests/functions/test_drop_duplicate_columns.py\u0000tests/functions/test_dropnotnull.py\u0000tests/functions/test_encode_categorical.py\u0000tests/functions/test_expand_column.py\u0000tests/functions/test_expand_grid.py\u0000tests/functions/test_fill_direction.py\u0000tests/functions/test_fill_empty.py\u0000tests/functions/test_filter_column_isin.py\u0000tests/functions/test_filter_date.py\u0000tests/functions/test_filter_on.py\u0000tests/functions/test_filter_string.py\u0000tests/functions/test_find_replace.py\u0000tests/functions/test_flag_nulls.py\u0000tests/functions/test_get_dupes.py\u0000tests/functions/test_groupby_agg.py\u0000tests/functions/test_groupby_topk.py\u0000tests/functions/test_impute.py\u0000tests/functions/test_jitter.py\u0000tests/functions/test_join_apply.py\u0000tests/functions/test_label_encode.py\u0000tests/functions/test_limit_column_characters.py\u0000tests/functions/test_min_max_scale.py\u0000tests/functions/test_move.py\u0000tests/functions/test_process_text.py\u0000tests/functions/test_remove_columns.py\u0000tests/functions/test_remove_empty.py\u0000tests/functions/test_rename_column.py\u0000tests/functions/test_rename_columns.py\u0000tests/functions/test_reorder_columns.py\u0000tests/functions/test_round_to_fraction.py\u0000tests/functions/test_row_to_names.py\u0000tests/functions/test_select_columns.py\u0000tests/functions/test_shuffle.py\u0000tests/functions/test_sort_naturally.py\u0000tests/functions/test_take_first.py\u0000tests/functions/test_then.py\u0000tests/functions/test_to_datetime.py\u0000tests/functions/test_toset.py\u0000tests/functions/test_transform_column.py\u0000tests/functions/test_transform_columns.py\u0000tests/functions/test_unionize_dataframe_categories.py\u0000tests/functions/test_update_where.py\u0000tests/helpers.py\u0000tests/io/test_read_csvs.py\u0000tests/math/test_ecdf.py\u0000tests/math/test_exp.py\u0000tests/math/test_log.py\u0000tests/math/test_logit.py\u0000tests/math/test_normal_cdf.py\u0000tests/math/test_probit.py\u0000tests/math/test_sigmoid.py\u0000tests/math/test_z_score.py\u0000tests/ml/test_get_features_targets.py\u0000tests/spark/conftest.py\u0000tests/spark/functions/test_clean_names_spark.py\u0000tests/spark/functions/test_update_where_spark.py\u0000tests/test_data/corrected_smiles.txt\u0000tests/test_data/sequences.fasta\u0000tests/test_data/sequences.tsv\u0000tests/test_df_registration.py\u0000tests/test_helpers.py\u0000tests/timeseries/test_fill_missing_timestamps.py\u0000tests/timeseries/test_sort_timestamps_monotonically.py\u0000tests/utils/test_check_column.py\u0000tests/utils/test_clean_accounting_column.py\u0000tests/utils/test_currency_column_to_numeric.py\u0000tests/utils/test_deprecated_alias.py\u0000tests/utils/test_idempotent.py\u0000tests/utils/test_import_message.py\u0000tests/utils/test_replace_empty_string_with_none.py\u0000tests/utils/test_skiperror.py\u0000tests/utils/test_skipna.py\u0000tests/xarray/conftest.py\u0000tests/xarray/test_clone_using.py\u0000tests/xarray/test_convert_datetime_to_number.py\u0000","stderr_tail":"","stdout_sha256":"b86e499b31b6f859452fcb06a202f6cee29ba278eef5fba35a77fec23fecc0e6","log_path":"~/dev/nebius-hackathon/pilot/v2-P/ericmjl__pyjanitor-728/runs/pilot-ericmjl__pyjanitor-728-65b2a91a53/logs/agent1/agent1-1.log","tree_digest":null,"tree_download_s":null,"started_at":"2026-10-03T20:14:46.819045Z","duration_s":0.003938,"timed_out":false,"image_before":"d93b3180-8441-4b72-b2a0-ae2f6dd551d3","image_after":"44024e91-ee50-4202-ac04-cb5b3744ff4f","junit":null,"diff":null,"patch_sha256":null,"dropped_paths":[],"snapshot_sha":null}
{"receipt_id":"agent1-2","seq":2,"branch_id":"agent1","kind":"write","cmd":"/opt/receipts-5be823a62c614c22b806b5b311e44fe9/bin/busybox sh -c 'mkdir -p /pyjanitor/janitor && cp /opt/receipts-5be823a62c614c22b806b5b311e44fe9/incoming/7ab84613c3960ffb7dccaf096b21e6255257dd21b9b3580080c379267dd92940 /pyjanitor/janitor/timeseries.py'","path":"janitor/timeseries.py","exit_code":0,"stdout_tail":"","stderr_tail":"","stdout_sha256":"7ab84613c3960ffb7dccaf096b21e6255257dd21b9b3580080c379267dd92940","log_path":"~/dev/nebius-hackathon/pilot/v2-P/ericmjl__pyjanitor-728/runs/pilot-ericmjl__pyjanitor-728-65b2a91a53/logs/agent1/agent1-2.log","tree_digest":null,"tree_download_s":null,"started_at":"2026-10-03T20:14:53.729014Z","duration_s":0.004839,"timed_out":false,"image_before":"44024e91-ee50-4202-ac04-cb5b3744ff4f","image_after":"65a4b0a0-0318-403c-8df3-e4c8fb816e38","junit":null,"diff":null,"patch_sha256":null,"dropped_paths":[],"snapshot_sha":null}
{"receipt_id":"agent1-3","seq":3,"branch_id":"agent1","kind":"write","cmd":"/opt/receipts-cca774a2692149c28e5db4699372fa63/bin/busybox sh -c 'mkdir -p /pyjanitor/janitor && cp /opt/receipts-cca774a2692149c28e5db4699372fa63/incoming/64e175efed7e47434a7463c21a25d083a4259a450535759ac91df16488b39c09 /pyjanitor/janitor/timeseries.py'","path":"janitor/timeseries.py","exit_code":0,"stdout_tail":"","stderr_tail":"","stdout_sha256":"64e175efed7e47434a7463c21a25d083a4259a450535759ac91df16488b39c09","log_path":"~/dev/nebius-hackathon/pilot/v2-P/ericmjl__pyjanitor-728/runs/pilot-ericmjl__pyjanitor-728-65b2a91a53/logs/agent1/agent1-3.log","tree_digest":null,"tree_download_s":null,"started_at":"2026-10-03T20:14:59.644228Z","duration_s":0.005248,"timed_out":false,"image_before":"65a4b0a0-0318-403c-8df3-e4c8fb816e38","image_after":"2e1a132f-e213-415d-b82e-55558a470341","junit":null,"diff":null,"patch_sha256":null,"dropped_paths":[],"snapshot_sha":null}
{"receipt_id":"agent1-4","seq":4,"branch_id":"agent1","kind":"command","cmd":"/opt/receipts-81643ac64f52464aa9abec53008b1396/bin/busybox mkdir -p /opt/receipts/reports && python -I /opt/receipts-81643ac64f52464aa9abec53008b1396/receipts_pytest.py tests/timeseries/test_sort_timestamps_monotonically.py -v -o junit_family=xunit1 -p no:cacheprovider -rA --continue-on-collection-errors --junitxml=/opt/receipts/reports/agent1-4.xml","path":null,"exit_code":1,"stdout_tail":" _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself =                        v1\n2019-01-09 22:00:00   620\n2019-01-21 03:00:00   523\n2019-01-28 13:00:00   572\n2019-02-01 15:...3 14:00:00  1173\n2019-01-24 18:00:00  1401\n2019-01-01 07:00:00   353\n2019-01-21 11:00:00   993\n\n[1000 rows x 1 columns]\nname = 'append'\n\n    @final\n    def __getattr__(self, name: str):\n        \"\"\"\n        After regular attribute access, try looking up the name\n        This allows simpler access to columns for interactive use.\n        \"\"\"\n        # Note: obj.x will always call obj.__getattribute__('x') prior to\n        # calling obj.__getattr__('x').\n        if (\n            name not in self._internal_names_set\n            and name not in self._metadata\n            and name not in self._accessors\n            and self._info_axis._can_hold_identifiers_and_holds_name(name)\n        ):\n            return self[name]\n>       return object.__getattribute__(self, name)\nE       AttributeError: 'DataFrame' object has no attribute 'append'. Did you mean: '_append'?\n\n/usr/local/lib/python3.10/site-packages/pandas/core/generic.py:6321: AttributeError\n=============================== warnings summary ===============================\ntests/timeseries/test_sort_timestamps_monotonically.py:27\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:27: PytestUnknownMarkWarning: Unknown pytest.mark.timeseries - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html\n    @pytest.mark.timeseries\n\ntests/timeseries/test_sort_timestamps_monotonically.py:36\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:36: PytestUnknownMarkWarning: Unknown pytest.mark.timeseries - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html\n    @pytest.mark.timeseries\n\ntests/timeseries/test_sort_timestamps_monotonically.py:44\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:44: PytestUnknownMarkWarning: Unknown pytest.mark.timeseries - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html\n    @pytest.mark.timeseries\n\ntests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically\ntests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_decreasing\ntests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_strict\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:13: FutureWarning: 'H' is deprecated and will be removed in a future version, please use 'h' instead.\n    ts_index = pd.date_range(\"1/1/2019\", periods=1000, freq=\"1H\")\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n------------ generated xml file: /opt/receipts/reports/agent1-4.xml ------------\n================================ tests coverage ================================\n_______________ coverage: platform linux, python 3.10.19-final-0 _______________\n\nName                                  Stmts   Miss  Cover   Missing\n-------------------------------------------------------------------\njanitor/__init__.py                      12      3    75%   4-5, 21\njanitor/biology.py                       14     14     0%   5-84\njanitor/chemistry.py                     73     73     0%   5-461\njanitor/engineering.py                   21     21     0%   5-106\njanitor/errors.py                         2      0   100%\njanitor/finance.py                       85     85     0%   5-654\njanitor/functions.py                    718    535    25%   90-134, 180-223, 287-308, 313-325, 330, 346-347, 355-358, 366, 404-410, 445-446, 480-495, 534-548, 583-585, 614-616, 657-667, 717-727, 761-766, 800-806, 838-842, 878-890, 929-934, 975-985, 1076-1124, 1189-1193, 1252-1255, 1432-1469, 1515-1524, 1548, 1585-1600, 1725-1772, 1809-1812, 1897-1929, 2044-2055, 2167-2177, 2272-2281, 2361-2385, 2461-2489, 2544-2555, 2745-2779, 2814-2844, 2909-2944, 2960-2961, 2981, 3067-3069, 3095-3109, 3164-3170, 3201-3203, 3250-3270, 3286-3295, 3300, 3304, 3308, 3315-3326, 3367-3379, 3418-3433, 3466-3470, 3496, 3544-3545, 3598-3617, 3681-3698, 3733, 3818-3840, 3912-3913, 4006-4027, 4116-4127, 4224-4268, 4369-4387\njanitor/io.py                            24     24     0%   1-63\njanitor/math.py                          79     55    30%   31-42, 48, 57, 76-89, 95, 115-128, 153-160, 191-200\njanitor/ml.py                            15      8    47%   60-71\njanitor/spark/__init__.py                 1      1     0%   1\njanitor/spark/backend.py                 37     37     0%   3-102\njanitor/spark/functions.py               30     30     0%   5-182\njanitor/testing_utils/__init__.py         0      0   100%\njanitor/testing_utils/date_data.py        1      0   100%\njanitor/testing_utils/strategies.py      12     12     0%   5-69\njanitor/timeseries.py                    41     31    24%   46-60, 83-98, 119-128, 151-157\njanitor/utils.py                        164    129    21%   29-36, 54-60, 73-101, 105-106, 110-111, 133-136, 143-155, 177-202, 217-220, 250-251, 282-283, 304-314, 335-343, 366-372, 400-408, 423-470, 490-539\njanitor/xarray/__init__.py                1      0   100%\njanitor/xarray/functions.py              16      7    56%   71-86, 128-130\n-------------------------------------------------------------------\nTOTAL                                  1346   1065    21%\n=========================== short test summary info ============================\nFAILED tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically\nFAILED tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_decreasing\nFAILED tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_strict\n======================== 3 failed, 6 warnings in 1.53s =========================\n","stderr_tail":"","stdout_sha256":"4517121fa5a9c647d03b754c35a6c2952b549cc7eac619f1408fb60b23e13d72","log_path":"~/dev/nebius-hackathon/pilot/v2-P/ericmjl__pyjanitor-728/runs/pilot-ericmjl__pyjanitor-728-65b2a91a53/logs/agent1/agent1-4.log","tree_digest":"abd99a532a9677fbd9b6e76310710884d7810c0ddaad64348ffaffcdd304f6fe","tree_download_s":6.347436542157084,"started_at":"2026-10-03T20:15:05.634338Z","duration_s":5.43921,"timed_out":false,"image_before":"2e1a132f-e213-415d-b82e-55558a470341","image_after":"408b4d43-0fb5-42cb-bb45-5185ca872700","junit":{"passed":[],"failed":["tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically","tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_decreasing","tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_strict"],"errors":[],"skipped":[],"collection_errors":[],"failure_text":{"tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically":"AttributeError: 'DataFrame' object has no attribute 'sort_timestamps_monotonically'\ntimeseries_dataframe =                        v1\n2019-01-01 00:00:00   731\n2019-01-01 01:00:00  1331\n2019-01-01 02:00:00  1904\n2019-01-01 03:...1 12:00:00   103\n2019-02-11 13:00:00   917\n2019-02-11 14:00:00  1623\n2019-02-11 15:00:00  1063\n\n[1000 rows x 1 columns]\n\n    @pytest.mark.timeseries\n    def test_sort_timestamps_monotonically(timeseries_dataframe):\n        \"\"\"Test sort_timestamps_monotonically for ascending order\"\"\"\n        df = timeseries_dataframe.shuffle(\n            reset_index=False\n>       ).sort_timestamps_monotonically()\n\ntests/timeseries/test_sort_timestamps_monotonically.py:32: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself =                        v1\n2019-01-27 12:00:00  1915\n2019-01-25 18:00:00  1689\n2019-01-02 10:00:00  1833\n2019-01-01 18:...2 00:00:00  1501\n2019-02-04 20:00:00  1148\n2019-01-30 17:00:00   237\n2019-01-05 20:00:00  1902\n\n[1000 rows x 1 columns]\nname = 'sort_timestamps_monotonically'\n\n    @final\n    def __getattr__(self, name: str):\n        \"\"\"\n        After regular attribute access, try looking up the name\n        This allows simpler access to columns for interactive use.\n        \"\"\"\n        # Note: obj.x will always call obj.__getattribute__('x') prior to\n        # calling obj.__getattr__('x').\n        if (\n            name not in self._internal_names_set\n            and name not in self._metadata\n            and name not in self._accessors\n            and self._info_axis._can_hold_identifiers_and_holds_name(name)\n        ):\n            return self[name]\n>       return object.__getattribute__(self, name)\nE       AttributeError: 'DataFrame' object has no attribute 'sort_timestamps_monotonically'\n\n/usr/local/lib/python3.10/site-packages/pandas/core/generic.py:6321: AttributeError","tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_decreasing":"AttributeError: 'DataFrame' object has no attribute 'sort_timestamps_monotonically'\ntimeseries_dataframe =                        v1\n2019-01-01 00:00:00   207\n2019-01-01 01:00:00   215\n2019-01-01 02:00:00  1881\n2019-01-01 03:...1 12:00:00   732\n2019-02-11 13:00:00   900\n2019-02-11 14:00:00   299\n2019-02-11 15:00:00   534\n\n[1000 rows x 1 columns]\n\n    @pytest.mark.timeseries\n    def test_sort_timestamps_monotonically_decreasing(timeseries_dataframe):\n        \"\"\"Test sort_timestamps_monotonically for descending order\"\"\"\n        df2 = timeseries_dataframe.sort_index(ascending=False)\n>       df3 = df2.sort_timestamps_monotonically(\"decreasing\")\n\ntests/timeseries/test_sort_timestamps_monotonically.py:40: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself =                        v1\n2019-02-11 15:00:00   534\n2019-02-11 14:00:00   299\n2019-02-11 13:00:00   900\n2019-02-11 12:...1 03:00:00   858\n2019-01-01 02:00:00  1881\n2019-01-01 01:00:00   215\n2019-01-01 00:00:00   207\n\n[1000 rows x 1 columns]\nname = 'sort_timestamps_monotonically'\n\n    @final\n    def __getattr__(self, name: str):\n        \"\"\"\n        After regular attribute access, try looking up the name\n        This allows simpler access to columns for interactive use.\n        \"\"\"\n        # Note: obj.x will always call obj.__getattribute__('x') prior to\n        # calling obj.__getattr__('x').\n        if (\n            name not in self._internal_names_set\n            and name not in self._metadata\n            and name not in self._accessors\n            and self._info_axis._can_hold_identifiers_and_holds_name(name)\n        ):\n            return self[name]\n>       return object.__getattribute__(self, name)\nE       AttributeError: 'DataFrame' object has no attribute 'sort_timestamps_monotonically'\n\n/usr/local/lib/python3.10/site-packages/pandas/core/generic.py:6321: AttributeError","tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_strict":"[...]ject has no attribute 'append'. Did you mean: '_append'?\ntimeseries_dataframe =                        v1\n2019-01-01 00:00:00  1819\n2019-01-01 01:00:00   984\n2019-01-01 02:00:00  1354\n2019-01-01 03:...1 12:00:00   299\n2019-02-11 13:00:00   519\n2019-02-11 14:00:00  1494\n2019-02-11 15:00:00   279\n\n[1000 rows x 1 columns]\n\n    @pytest.mark.timeseries\n    def test_sort_timestamps_monotonically_strict(timeseries_dataframe):\n        \"\"\"Test sort_timestamps_monotonically for index duplication handling\"\"\"\n        df = timeseries_dataframe.shuffle(reset_index=False)\n        random_number = randint(1, len(timeseries_dataframe))\n>       df = df.append(\n            df.loc[df.index[random_number], :]\n        ).sort_timestamps_monotonically(direction=\"increasing\", strict=True)\n\ntests/timeseries/test_sort_timestamps_monotonically.py:49: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself =                        v1\n2019-01-09 22:00:00   620\n2019-01-21 03:00:00   523\n2019-01-28 13:00:00   572\n2019-02-01 15:...3 14:00:00  1173\n2019-01-24 18:00:00  1401\n2019-01-01 07:00:00   353\n2019-01-21 11:00:00   993\n\n[1000 rows x 1 columns]\nname = 'append'\n\n    @final\n    def __getattr__(self, name: str):\n        \"\"\"\n        After regular attribute access, try looking up the name\n        This allows simpler access to columns for interactive use.\n        \"\"\"\n        # Note: obj.x will always call obj.__getattribute__('x') prior to\n        # calling obj.__getattr__('x').\n        if (\n            name not in self._internal_names_set\n            and name not in self._metadata\n            and name not in self._accessors\n            and self._info_axis._can_hold_identifiers_and_holds_name(name)\n        ):\n            return self[name]\n>       return object.__getattribute__(self, name)\nE       AttributeError: 'DataFrame' object has no attribute 'append'. Did you mean: '_append'?\n\n/usr/local/lib/python3.10/site-packages/pandas/core/generic.py:6321: AttributeError"}},"diff":null,"patch_sha256":null,"dropped_paths":[],"snapshot_sha":null}
{"receipt_id":"agent1-5","seq":5,"branch_id":"agent1","kind":"write","cmd":"/opt/receipts-18faa69e317543f689c32b0704853e21/bin/busybox sh -c 'mkdir -p /pyjanitor/janitor && cp /opt/receipts-18faa69e317543f689c32b0704853e21/incoming/47d14fa61569df09da803cbe399a1180791074b5f741c075c8aef6a27038271b /pyjanitor/janitor/timeseries.py'","path":"janitor/timeseries.py","exit_code":0,"stdout_tail":"","stderr_tail":"","stdout_sha256":"47d14fa61569df09da803cbe399a1180791074b5f741c075c8aef6a27038271b","log_path":"~/dev/nebius-hackathon/pilot/v2-P/ericmjl__pyjanitor-728/runs/pilot-ericmjl__pyjanitor-728-65b2a91a53/logs/agent1/agent1-5.log","tree_digest":null,"tree_download_s":null,"started_at":"2026-10-03T20:15:28.406648Z","duration_s":0.005115,"timed_out":false,"image_before":"408b4d43-0fb5-42cb-bb45-5185ca872700","image_after":"fd25f4b8-8553-4382-baf5-4bc2f27264df","junit":null,"diff":null,"patch_sha256":null,"dropped_paths":[],"snapshot_sha":null}
{"receipt_id":"agent1-6","seq":6,"branch_id":"agent1","kind":"write","cmd":"/opt/receipts-e19f3051fa0e48d09de768410451043d/bin/busybox sh -c 'mkdir -p /pyjanitor/janitor && cp /opt/receipts-e19f3051fa0e48d09de768410451043d/incoming/47d14fa61569df09da803cbe399a1180791074b5f741c075c8aef6a27038271b /pyjanitor/janitor/timeseries.py'","path":"janitor/timeseries.py","exit_code":0,"stdout_tail":"","stderr_tail":"","stdout_sha256":"47d14fa61569df09da803cbe399a1180791074b5f741c075c8aef6a27038271b","log_path":"~/dev/nebius-hackathon/pilot/v2-P/ericmjl__pyjanitor-728/runs/pilot-ericmjl__pyjanitor-728-65b2a91a53/logs/agent1/agent1-6.log","tree_digest":null,"tree_download_s":null,"started_at":"2026-10-03T20:15:32.281173Z","duration_s":0.005272,"timed_out":false,"image_before":"fd25f4b8-8553-4382-baf5-4bc2f27264df","image_after":"f1e1909f-49f6-4f80-942c-4e39f64e781f","junit":null,"diff":null,"patch_sha256":null,"dropped_paths":[],"snapshot_sha":null}
{"receipt_id":"agent1-7","seq":7,"branch_id":"agent1","kind":"command","cmd":"/opt/receipts-b6a066d523c84e848c58677410508e44/bin/busybox mkdir -p /opt/receipts/reports && python -I /opt/receipts-b6a066d523c84e848c58677410508e44/receipts_pytest.py tests/timeseries/test_sort_timestamps_monotonically.py -v -o junit_family=xunit1 -p no:cacheprovider -rA --continue-on-collection-errors --junitxml=/opt/receipts/reports/agent1-7.xml","path":null,"exit_code":1,"stdout_tail":"4:00:00   279\n2019-02-11 01:00:00  1391\n2019-01-05 07:00:00  1588\n2019-02-05 00:...3 01:00:00    33\n2019-01-15 07:00:00   746\n2019-01-06 05:00:00  1757\n2019-02-06 17:00:00   244\n\n[1000 rows x 1 columns]\nname = 'append'\n\n    @final\n    def __getattr__(self, name: str):\n        \"\"\"\n        After regular attribute access, try looking up the name\n        This allows simpler access to columns for interactive use.\n        \"\"\"\n        # Note: obj.x will always call obj.__getattribute__('x') prior to\n        # calling obj.__getattr__('x').\n        if (\n            name not in self._internal_names_set\n            and name not in self._metadata\n            and name not in self._accessors\n            and self._info_axis._can_hold_identifiers_and_holds_name(name)\n        ):\n            return self[name]\n>       return object.__getattribute__(self, name)\nE       AttributeError: 'DataFrame' object has no attribute 'append'. Did you mean: '_append'?\n\n/usr/local/lib/python3.10/site-packages/pandas/core/generic.py:6321: AttributeError\n=============================== warnings summary ===============================\ntests/timeseries/test_sort_timestamps_monotonically.py:27\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:27: PytestUnknownMarkWarning: Unknown pytest.mark.timeseries - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html\n    @pytest.mark.timeseries\n\ntests/timeseries/test_sort_timestamps_monotonically.py:36\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:36: PytestUnknownMarkWarning: Unknown pytest.mark.timeseries - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html\n    @pytest.mark.timeseries\n\ntests/timeseries/test_sort_timestamps_monotonically.py:44\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:44: PytestUnknownMarkWarning: Unknown pytest.mark.timeseries - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html\n    @pytest.mark.timeseries\n\ntests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically\ntests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_decreasing\ntests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_strict\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:13: FutureWarning: 'H' is deprecated and will be removed in a future version, please use 'h' instead.\n    ts_index = pd.date_range(\"1/1/2019\", periods=1000, freq=\"1H\")\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n==================================== PASSES ====================================\n------------ generated xml file: /opt/receipts/reports/agent1-7.xml ------------\n================================ tests coverage ================================\n_______________ coverage: platform linux, python 3.10.19-final-0 _______________\n\nName                                  Stmts   Miss  Cover   Missing\n-------------------------------------------------------------------\njanitor/__init__.py                      12      3    75%   4-5, 21\njanitor/biology.py                       14     14     0%   5-84\njanitor/chemistry.py                     73     73     0%   5-461\njanitor/engineering.py                   21     21     0%   5-106\njanitor/errors.py                         2      0   100%\njanitor/finance.py                       85     85     0%   5-654\njanitor/functions.py                    718    535    25%   90-134, 180-223, 287-308, 313-325, 330, 346-347, 355-358, 366, 404-410, 445-446, 480-495, 534-548, 583-585, 614-616, 657-667, 717-727, 761-766, 800-806, 838-842, 878-890, 929-934, 975-985, 1076-1124, 1189-1193, 1252-1255, 1432-1469, 1515-1524, 1548, 1585-1600, 1725-1772, 1809-1812, 1897-1929, 2044-2055, 2167-2177, 2272-2281, 2361-2385, 2461-2489, 2544-2555, 2745-2779, 2814-2844, 2909-2944, 2960-2961, 2981, 3067-3069, 3095-3109, 3164-3170, 3201-3203, 3250-3270, 3286-3295, 3300, 3304, 3308, 3315-3326, 3367-3379, 3418-3433, 3466-3470, 3496, 3544-3545, 3598-3617, 3681-3698, 3733, 3818-3840, 3912-3913, 4006-4027, 4116-4127, 4224-4268, 4369-4387\njanitor/io.py                            24     24     0%   1-63\njanitor/math.py                          79     55    30%   31-42, 48, 57, 76-89, 95, 115-128, 153-160, 191-200\njanitor/ml.py                            15      8    47%   60-71\njanitor/spark/__init__.py                 1      1     0%   1\njanitor/spark/backend.py                 37     37     0%   3-102\njanitor/spark/functions.py               30     30     0%   5-182\njanitor/testing_utils/__init__.py         0      0   100%\njanitor/testing_utils/date_data.py        1      0   100%\njanitor/testing_utils/strategies.py      12     12     0%   5-69\njanitor/timeseries.py                    46     29    37%   46-60, 87-88, 95-98, 123-138, 161-167\njanitor/utils.py                        164    129    21%   29-36, 54-60, 73-101, 105-106, 110-111, 133-136, 143-155, 177-202, 217-220, 250-251, 282-283, 304-314, 335-343, 366-372, 400-408, 423-470, 490-539\njanitor/xarray/__init__.py                1      0   100%\njanitor/xarray/functions.py              16      7    56%   71-86, 128-130\n-------------------------------------------------------------------\nTOTAL                                  1351   1063    21%\n=========================== short test summary info ============================\nPASSED tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically\nFAILED tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_decreasing\nFAILED tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_strict\n=================== 2 failed, 1 passed, 6 warnings in 1.31s ====================\n","stderr_tail":"","stdout_sha256":"5816f8ac8ac2fdec39c7858cafa388116a3783b9149babe4dc9a7ff0f1074288","log_path":"~/dev/nebius-hackathon/pilot/v2-P/ericmjl__pyjanitor-728/runs/pilot-ericmjl__pyjanitor-728-65b2a91a53/logs/agent1/agent1-7.log","tree_digest":"bceb55006082ee50ffa1e8a9223726572268996e81097138f6ce2a81b0b55747","tree_download_s":4.580626958049834,"started_at":"2026-10-03T20:15:36.814327Z","duration_s":5.248882999999999,"timed_out":false,"image_before":"f1e1909f-49f6-4f80-942c-4e39f64e781f","image_after":"913337a3-1e99-4a27-80de-a9ff2b5db206","junit":{"passed":["tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically"],"failed":["tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_decreasing","tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_strict"],"errors":[],"skipped":[],"collection_errors":[],"failure_text":{"tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_decreasing":"[...]nically for descending order\"\"\"\n        df2 = timeseries_dataframe.sort_index(ascending=False)\n>       df3 = df2.sort_timestamps_monotonically(\"decreasing\")\n\ntests/timeseries/test_sort_timestamps_monotonically.py:40: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n/usr/local/lib/python3.10/site-packages/pandas_flavor/register.py:29: in __call__\n    return method(self._obj, *args, **kwargs)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ndf =                        v1\n2019-02-11 15:00:00  1631\n2019-02-11 14:00:00   988\n2019-02-11 13:00:00   973\n2019-02-11 12:...1 03:00:00  1426\n2019-01-01 02:00:00  1554\n2019-01-01 01:00:00    74\n2019-01-01 00:00:00   649\n\n[1000 rows x 1 columns]\ncolumn_name = 'decreasing', direction = 'increasing', strict = False\n\n    @pf.register_dataframe_method\n    def sort_timestamps_monotonically(\n        df: pd.DataFrame,\n        column_name: str = None,\n        direction: str = \"increasing\",\n        strict: bool = False,\n    ) -> pd.DataFrame:\n        \"\"\"\n        Sorts data frame monotonically.\n        It assumes the data frame has an index of type pd.DateTimeIndex when index is datetime.\n        If datetime is in a column, then the column is expected to be of type pd.Timestamp\n    \n        :param df: data frame to sort monotonically\n        :param column_name: needs to be specified if and only if the date time is not in index.\n            Defaults to None\n        :param direction: specifies the direction in which monotonicity is being tested for.\n            Defaults to 'increasing'\n        :param strict: whether to drop duplicates after sorting\n        :return: data frame with its index sorted\n        \"\"\"\n        if column_name is not None:\n            if column_name not in df.columns:\n>               raise KeyError(f\"Column '{column_name}' not found in DataFrame\")\nE               KeyError: \"Column 'decreasing' not found in DataFrame\"\n\njanitor/timeseries.py:85: KeyError","tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_strict":"[...]ject has no attribute 'append'. Did you mean: '_append'?\ntimeseries_dataframe =                        v1\n2019-01-01 00:00:00  1255\n2019-01-01 01:00:00  1702\n2019-01-01 02:00:00   473\n2019-01-01 03:...1 12:00:00  1160\n2019-02-11 13:00:00  1257\n2019-02-11 14:00:00   189\n2019-02-11 15:00:00  1616\n\n[1000 rows x 1 columns]\n\n    @pytest.mark.timeseries\n    def test_sort_timestamps_monotonically_strict(timeseries_dataframe):\n        \"\"\"Test sort_timestamps_monotonically for index duplication handling\"\"\"\n        df = timeseries_dataframe.shuffle(reset_index=False)\n        random_number = randint(1, len(timeseries_dataframe))\n>       df = df.append(\n            df.loc[df.index[random_number], :]\n        ).sort_timestamps_monotonically(direction=\"increasing\", strict=True)\n\ntests/timeseries/test_sort_timestamps_monotonically.py:49: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself =                        v1\n2019-01-22 04:00:00   279\n2019-02-11 01:00:00  1391\n2019-01-05 07:00:00  1588\n2019-02-05 00:...3 01:00:00    33\n2019-01-15 07:00:00   746\n2019-01-06 05:00:00  1757\n2019-02-06 17:00:00   244\n\n[1000 rows x 1 columns]\nname = 'append'\n\n    @final\n    def __getattr__(self, name: str):\n        \"\"\"\n        After regular attribute access, try looking up the name\n        This allows simpler access to columns for interactive use.\n        \"\"\"\n        # Note: obj.x will always call obj.__getattribute__('x') prior to\n        # calling obj.__getattr__('x').\n        if (\n            name not in self._internal_names_set\n            and name not in self._metadata\n            and name not in self._accessors\n            and self._info_axis._can_hold_identifiers_and_holds_name(name)\n        ):\n            return self[name]\n>       return object.__getattribute__(self, name)\nE       AttributeError: 'DataFrame' object has no attribute 'append'. Did you mean: '_append'?\n\n/usr/local/lib/python3.10/site-packages/pandas/core/generic.py:6321: AttributeError"}},"diff":null,"patch_sha256":null,"dropped_paths":[],"snapshot_sha":null}
{"receipt_id":"agent1-8","seq":8,"branch_id":"agent1","kind":"write","cmd":"/opt/receipts-46985fcca1db4d2aa37dd6938dd7ae8a/bin/busybox sh -c 'mkdir -p /pyjanitor/janitor && cp /opt/receipts-46985fcca1db4d2aa37dd6938dd7ae8a/incoming/47d14fa61569df09da803cbe399a1180791074b5f741c075c8aef6a27038271b /pyjanitor/janitor/timeseries.py'","path":"janitor/timeseries.py","exit_code":0,"stdout_tail":"","stderr_tail":"","stdout_sha256":"47d14fa61569df09da803cbe399a1180791074b5f741c075c8aef6a27038271b","log_path":"~/dev/nebius-hackathon/pilot/v2-P/ericmjl__pyjanitor-728/runs/pilot-ericmjl__pyjanitor-728-65b2a91a53/logs/agent1/agent1-8.log","tree_digest":null,"tree_download_s":null,"started_at":"2026-10-03T20:15:59.053219Z","duration_s":0.004682,"timed_out":false,"image_before":"913337a3-1e99-4a27-80de-a9ff2b5db206","image_after":"bfdd313c-9598-4db3-9164-7fc40f821c51","junit":null,"diff":null,"patch_sha256":null,"dropped_paths":[],"snapshot_sha":null}
{"receipt_id":"agent1-9","seq":9,"branch_id":"agent1","kind":"command","cmd":"/opt/receipts-0427ff8b76d048f3acd4236d11ca0bfd/bin/busybox mkdir -p /opt/receipts/reports && python -I /opt/receipts-0427ff8b76d048f3acd4236d11ca0bfd/receipts_pytest.py tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_decreasing -v -s -o junit_family=xunit1 -p no:cacheprovider -rA --continue-on-collection-errors --junitxml=/opt/receipts/reports/agent1-9.xml","path":null,"exit_code":1,"stdout_tail":"_ _ _ _ \n\ndf =                        v1\n2019-02-11 15:00:00   240\n2019-02-11 14:00:00   532\n2019-02-11 13:00:00  1224\n2019-02-11 12:...1 03:00:00   519\n2019-01-01 02:00:00  1844\n2019-01-01 01:00:00    24\n2019-01-01 00:00:00  1173\n\n[1000 rows x 1 columns]\ncolumn_name = 'decreasing', direction = 'increasing', strict = False\n\n    @pf.register_dataframe_method\n    def sort_timestamps_monotonically(\n        df: pd.DataFrame,\n        column_name: str = None,\n        direction: str = \"increasing\",\n        strict: bool = False,\n    ) -> pd.DataFrame:\n        \"\"\"\n        Sorts data frame monotonically.\n        It assumes the data frame has an index of type pd.DateTimeIndex when index is datetime.\n        If datetime is in a column, then the column is expected to be of type pd.Timestamp\n    \n        :param df: data frame to sort monotonically\n        :param column_name: needs to be specified if and only if the date time is not in index.\n            Defaults to None\n        :param direction: specifies the direction in which monotonicity is being tested for.\n            Defaults to 'increasing'\n        :param strict: whether to drop duplicates after sorting\n        :return: data frame with its index sorted\n        \"\"\"\n        if column_name is not None:\n            if column_name not in df.columns:\n>               raise KeyError(f\"Column '{column_name}' not found in DataFrame\")\nE               KeyError: \"Column 'decreasing' not found in DataFrame\"\n\njanitor/timeseries.py:85: KeyError\n=============================== warnings summary ===============================\ntests/timeseries/test_sort_timestamps_monotonically.py:27\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:27: PytestUnknownMarkWarning: Unknown pytest.mark.timeseries - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html\n    @pytest.mark.timeseries\n\ntests/timeseries/test_sort_timestamps_monotonically.py:36\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:36: PytestUnknownMarkWarning: Unknown pytest.mark.timeseries - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html\n    @pytest.mark.timeseries\n\ntests/timeseries/test_sort_timestamps_monotonically.py:44\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:44: PytestUnknownMarkWarning: Unknown pytest.mark.timeseries - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html\n    @pytest.mark.timeseries\n\ntests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_decreasing\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:13: FutureWarning: 'H' is deprecated and will be removed in a future version, please use 'h' instead.\n    ts_index = pd.date_range(\"1/1/2019\", periods=1000, freq=\"1H\")\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n------------ generated xml file: /opt/receipts/reports/agent1-9.xml ------------\n================================ tests coverage ================================\n_______________ coverage: platform linux, python 3.10.19-final-0 _______________\n\nName                                  Stmts   Miss  Cover   Missing\n-------------------------------------------------------------------\njanitor/__init__.py                      12      3    75%   4-5, 21\njanitor/biology.py                       14     14     0%   5-84\njanitor/chemistry.py                     73     73     0%   5-461\njanitor/engineering.py                   21     21     0%   5-106\njanitor/errors.py                         2      0   100%\njanitor/finance.py                       85     85     0%   5-654\njanitor/functions.py                    718    540    25%   90-134, 180-223, 287-308, 313-325, 330, 346-347, 355-358, 366, 404-410, 445-446, 480-495, 534-548, 583-585, 614-616, 657-667, 717-727, 761-766, 800-806, 838-842, 878-890, 929-934, 975-985, 1076-1124, 1189-1193, 1252-1255, 1432-1469, 1515-1524, 1548, 1585-1600, 1725-1772, 1809-1812, 1897-1929, 2044-2055, 2167-2177, 2272-2281, 2361-2385, 2461-2489, 2544-2555, 2745-2779, 2814-2844, 2909-2944, 2960-2961, 2981, 3067-3069, 3095-3109, 3164-3170, 3201-3203, 3250-3270, 3282-3283, 3286-3295, 3300, 3304, 3308, 3315-3326, 3367-3379, 3418-3433, 3466-3470, 3494-3497, 3544-3545, 3598-3617, 3681-3698, 3733, 3818-3840, 3912-3913, 4006-4027, 4116-4127, 4224-4268, 4369-4387\njanitor/io.py                            24     24     0%   1-63\njanitor/math.py                          79     55    30%   31-42, 48, 57, 76-89, 95, 115-128, 153-160, 191-200\njanitor/ml.py                            15      8    47%   60-71\njanitor/spark/__init__.py                 1      1     0%   1\njanitor/spark/backend.py                 37     37     0%   3-102\njanitor/spark/functions.py               30     30     0%   5-182\njanitor/testing_utils/__init__.py         0      0   100%\njanitor/testing_utils/date_data.py        1      0   100%\njanitor/testing_utils/strategies.py      12     12     0%   5-69\njanitor/timeseries.py                    46     33    28%   46-60, 87-100, 123-138, 161-167\njanitor/utils.py                        164    129    21%   29-36, 54-60, 73-101, 105-106, 110-111, 133-136, 143-155, 177-202, 217-220, 250-251, 282-283, 304-314, 335-343, 366-372, 400-408, 423-470, 490-539\njanitor/xarray/__init__.py                1      0   100%\njanitor/xarray/functions.py              16      7    56%   71-86, 128-130\n-------------------------------------------------------------------\nTOTAL                                  1351   1072    21%\n=========================== short test summary info ============================\nFAILED tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_decreasing\n======================== 1 failed, 4 warnings in 1.12s =========================\n","stderr_tail":"","stdout_sha256":"13286059b8ad5f540e1ae0fe3cd0a00c0c27115b144799202374bbb72bbe2fe8","log_path":"~/dev/nebius-hackathon/pilot/v2-P/ericmjl__pyjanitor-728/runs/pilot-ericmjl__pyjanitor-728-65b2a91a53/logs/agent1/agent1-9.log","tree_digest":"f3fc727d101d3f5f4b1cbc17ce135e97aaee2de8dadb3b70b5d0eec006b7e4e2","tree_download_s":4.953356208978221,"started_at":"2026-10-03T20:16:01.989288Z","duration_s":4.957133000000001,"timed_out":false,"image_before":"bfdd313c-9598-4db3-9164-7fc40f821c51","image_after":"e30a6dec-46d7-4d38-bf38-514329999768","junit":{"passed":[],"failed":["tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_decreasing"],"errors":[],"skipped":[],"collection_errors":[],"failure_text":{"tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_decreasing":"[...]nically for descending order\"\"\"\n        df2 = timeseries_dataframe.sort_index(ascending=False)\n>       df3 = df2.sort_timestamps_monotonically(\"decreasing\")\n\ntests/timeseries/test_sort_timestamps_monotonically.py:40: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n/usr/local/lib/python3.10/site-packages/pandas_flavor/register.py:29: in __call__\n    return method(self._obj, *args, **kwargs)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ndf =                        v1\n2019-02-11 15:00:00   240\n2019-02-11 14:00:00   532\n2019-02-11 13:00:00  1224\n2019-02-11 12:...1 03:00:00   519\n2019-01-01 02:00:00  1844\n2019-01-01 01:00:00    24\n2019-01-01 00:00:00  1173\n\n[1000 rows x 1 columns]\ncolumn_name = 'decreasing', direction = 'increasing', strict = False\n\n    @pf.register_dataframe_method\n    def sort_timestamps_monotonically(\n        df: pd.DataFrame,\n        column_name: str = None,\n        direction: str = \"increasing\",\n        strict: bool = False,\n    ) -> pd.DataFrame:\n        \"\"\"\n        Sorts data frame monotonically.\n        It assumes the data frame has an index of type pd.DateTimeIndex when index is datetime.\n        If datetime is in a column, then the column is expected to be of type pd.Timestamp\n    \n        :param df: data frame to sort monotonically\n        :param column_name: needs to be specified if and only if the date time is not in index.\n            Defaults to None\n        :param direction: specifies the direction in which monotonicity is being tested for.\n            Defaults to 'increasing'\n        :param strict: whether to drop duplicates after sorting\n        :return: data frame with its index sorted\n        \"\"\"\n        if column_name is not None:\n            if column_name not in df.columns:\n>               raise KeyError(f\"Column '{column_name}' not found in DataFrame\")\nE               KeyError: \"Column 'decreasing' not found in DataFrame\"\n\njanitor/timeseries.py:85: KeyError"}},"diff":null,"patch_sha256":null,"dropped_paths":[],"snapshot_sha":null}
{"receipt_id":"agent1-10","seq":10,"branch_id":"agent1","kind":"command","cmd":"grep -n \"\\.\" tests/timeseries/test_fill_missing_timestamps.py | head -10","path":null,"exit_code":0,"stdout_tail":"4:from janitor.timeseries import fill_missing_timestamps, _get_missing_timestamps\n8:@pytest.fixture\n9:def timeseries_dataframe() -> pd.DataFrame:\n13:    ts_index = pd.date_range(\"1/1/2019\", periods=1000, freq=\"1H\")\n15:    test_df = pd.DataFrame({\"v1\": v1}, index=ts_index)\n19:@pytest.mark.timeseries\n21:    \"\"\"Test that filling missing timestamps works as expected.\"\"\"\n24:    df1 = timeseries_dataframe.drop(timeseries_dataframe.index[random_number])\n33:    original_index = timeseries_dataframe.index\n34:    new_index = result.index\n","stderr_tail":"","stdout_sha256":"80c1ec1149778d182b00c2a99a7f83ef40a16269590493b15bfd3e4af4704130","log_path":"~/dev/nebius-hackathon/pilot/v2-P/ericmjl__pyjanitor-728/runs/pilot-ericmjl__pyjanitor-728-65b2a91a53/logs/agent1/agent1-10.log","tree_digest":null,"tree_download_s":null,"started_at":"2026-10-03T20:16:17.708419Z","duration_s":0.004679,"timed_out":false,"image_before":"e30a6dec-46d7-4d38-bf38-514329999768","image_after":"c0956661-3790-40d9-8922-7e6cb534d528","junit":null,"diff":null,"patch_sha256":null,"dropped_paths":[],"snapshot_sha":null}
{"receipt_id":"agent1-11","seq":11,"branch_id":"agent1","kind":"command","cmd":"grep -A5 -B5 \"\\..*\" tests/timeseries/test_fill_missing_timestamps.py","path":null,"exit_code":0,"stdout_tail":"import pytest\nimport pandas as pd\nfrom random import randint\nfrom janitor.timeseries import fill_missing_timestamps, _get_missing_timestamps\n\n\n# Random data for testing\n@pytest.fixture\ndef timeseries_dataframe() -> pd.DataFrame:\n    \"\"\"\n    Returns a time series dataframe\n    \"\"\"\n    ts_index = pd.date_range(\"1/1/2019\", periods=1000, freq=\"1H\")\n    v1 = [randint(1, 2000) for i in range(1000)]\n    test_df = pd.DataFrame({\"v1\": v1}, index=ts_index)\n    return test_df\n\n\n@pytest.mark.timeseries\ndef test_fill_missing_timestamps(timeseries_dataframe):\n    \"\"\"Test that filling missing timestamps works as expected.\"\"\"\n    # Remove random row from the data frame\n    random_number = randint(1, len(timeseries_dataframe))\n    df1 = timeseries_dataframe.drop(timeseries_dataframe.index[random_number])\n\n    # Fill missing timestamps\n    result = fill_missing_timestamps(df1, frequency=\"1H\")\n\n    # Testing if the missing timestamp has been filled\n    assert len(result) == len(timeseries_dataframe)\n\n    # Testing if indices are exactly the same after filling\n    original_index = timeseries_dataframe.index\n    new_index = result.index\n    delta = original_index.difference(new_index)\n\n    assert delta.empty is True\n\n\n@pytest.mark.timeseries\ndef test__get_missing_timestamps(timeseries_dataframe):\n    \"\"\"Test utility function for identifying the missing timestamps.\"\"\"\n    from random import sample\n\n    timestamps_to_drop = sample(timeseries_dataframe.index.tolist(), 3)\n    df = timeseries_dataframe.drop(index=timestamps_to_drop)\n    missing_timestamps = _get_missing_timestamps(df, \"1H\")\n    assert set(missing_timestamps.index) == set(timestamps_to_drop)\n","stderr_tail":"","stdout_sha256":"7a9895880015ac862884d09a5eeea29fb7d30eebccbf2122f76dbdccadac3f2d","log_path":"~/dev/nebius-hackathon/pilot/v2-P/ericmjl__pyjanitor-728/runs/pilot-ericmjl__pyjanitor-728-65b2a91a53/logs/agent1/agent1-11.log","tree_digest":null,"tree_download_s":null,"started_at":"2026-10-03T20:16:20.801155Z","duration_s":0.003056,"timed_out":false,"image_before":"c0956661-3790-40d9-8922-7e6cb534d528","image_after":"48c4110c-4790-4e1b-82fd-bce56538c9a6","junit":null,"diff":null,"patch_sha256":null,"dropped_paths":[],"snapshot_sha":null}
{"receipt_id":"agent1-12","seq":12,"branch_id":"agent1","kind":"command","cmd":"find tests/ -name \"*.py\" -exec grep -l \"\\.sort_index\\|\\.sort_values\" {} \\;","path":null,"exit_code":0,"stdout_tail":"tests/functions/test_groupby_topk.py\ntests/functions/test_sort_naturally.py\ntests/timeseries/test_sort_timestamps_monotonically.py\n","stderr_tail":"","stdout_sha256":"d8b47a02a9a7084c1f4441972cd7521661fcb3b112476ee9fe7d7dde58573127","log_path":"~/dev/nebius-hackathon/pilot/v2-P/ericmjl__pyjanitor-728/runs/pilot-ericmjl__pyjanitor-728-65b2a91a53/logs/agent1/agent1-12.log","tree_digest":null,"tree_download_s":null,"started_at":"2026-10-03T20:16:23.912094Z","duration_s":0.11285999999999999,"timed_out":false,"image_before":"48c4110c-4790-4e1b-82fd-bce56538c9a6","image_after":"1dd5932d-dd07-4456-8147-f92021d6c34f","junit":null,"diff":null,"patch_sha256":null,"dropped_paths":[],"snapshot_sha":null}
{"receipt_id":"agent1-13","seq":13,"branch_id":"agent1","kind":"write","cmd":"/opt/receipts-fd0bdd0fb83d4821978f2f7e793db5c4/bin/busybox sh -c 'mkdir -p /pyjanitor/janitor && cp /opt/receipts-fd0bdd0fb83d4821978f2f7e793db5c4/incoming/545c58e316638a3b5119f74f0fee89c47525fbbf618266eb685b5705e5c6b07a /pyjanitor/janitor/timeseries.py'","path":"janitor/timeseries.py","exit_code":0,"stdout_tail":"","stderr_tail":"","stdout_sha256":"545c58e316638a3b5119f74f0fee89c47525fbbf618266eb685b5705e5c6b07a","log_path":"~/dev/nebius-hackathon/pilot/v2-P/ericmjl__pyjanitor-728/runs/pilot-ericmjl__pyjanitor-728-65b2a91a53/logs/agent1/agent1-13.log","tree_digest":null,"tree_download_s":null,"started_at":"2026-10-03T20:16:41.380437Z","duration_s":0.004551,"timed_out":false,"image_before":"1dd5932d-dd07-4456-8147-f92021d6c34f","image_after":"cd09b158-fc56-4d8a-9b46-d13f24992a44","junit":null,"diff":null,"patch_sha256":null,"dropped_paths":[],"snapshot_sha":null}
{"receipt_id":"agent1-14","seq":14,"branch_id":"agent1","kind":"command","cmd":"/opt/receipts-bcd3179b26b54992b8dec005fd434ede/bin/busybox mkdir -p /opt/receipts/reports && python -I /opt/receipts-bcd3179b26b54992b8dec005fd434ede/receipts_pytest.py tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_decreasing -v -o junit_family=xunit1 -p no:cacheprovider -rA --continue-on-collection-errors --junitxml=/opt/receipts/reports/agent1-14.xml","path":null,"exit_code":0,"stdout_tail":"============================= test session starts ==============================\nplatform linux -- Python 3.10.19, pytest-9.0.2, pluggy-1.6.0 -- /usr/local/bin/python\nhypothesis profile 'default'\nrootdir: /pyjanitor\nconfigfile: pytest.ini\nplugins: hypothesis-6.151.9, cov-7.0.0\ncollecting ... collected 1 item\n\ntests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_decreasing PASSED [100%]\n\n=============================== warnings summary ===============================\ntests/timeseries/test_sort_timestamps_monotonically.py:27\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:27: PytestUnknownMarkWarning: Unknown pytest.mark.timeseries - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html\n    @pytest.mark.timeseries\n\ntests/timeseries/test_sort_timestamps_monotonically.py:36\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:36: PytestUnknownMarkWarning: Unknown pytest.mark.timeseries - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html\n    @pytest.mark.timeseries\n\ntests/timeseries/test_sort_timestamps_monotonically.py:44\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:44: PytestUnknownMarkWarning: Unknown pytest.mark.timeseries - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html\n    @pytest.mark.timeseries\n\ntests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_decreasing\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:13: FutureWarning: 'H' is deprecated and will be removed in a future version, please use 'h' instead.\n    ts_index = pd.date_range(\"1/1/2019\", periods=1000, freq=\"1H\")\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n==================================== PASSES ====================================\n----------- generated xml file: /opt/receipts/reports/agent1-14.xml ------------\n================================ tests coverage ================================\n_______________ coverage: platform linux, python 3.10.19-final-0 _______________\n\nName                                  Stmts   Miss  Cover   Missing\n-------------------------------------------------------------------\njanitor/__init__.py                      12      3    75%   4-5, 21\njanitor/biology.py                       14     14     0%   5-84\njanitor/chemistry.py                     73     73     0%   5-461\njanitor/engineering.py                   21     21     0%   5-106\njanitor/errors.py                         2      0   100%\njanitor/finance.py                       85     85     0%   5-654\njanitor/functions.py                    718    540    25%   90-134, 180-223, 287-308, 313-325, 330, 346-347, 355-358, 366, 404-410, 445-446, 480-495, 534-548, 583-585, 614-616, 657-667, 717-727, 761-766, 800-806, 838-842, 878-890, 929-934, 975-985, 1076-1124, 1189-1193, 1252-1255, 1432-1469, 1515-1524, 1548, 1585-1600, 1725-1772, 1809-1812, 1897-1929, 2044-2055, 2167-2177, 2272-2281, 2361-2385, 2461-2489, 2544-2555, 2745-2779, 2814-2844, 2909-2944, 2960-2961, 2981, 3067-3069, 3095-3109, 3164-3170, 3201-3203, 3250-3270, 3282-3283, 3286-3295, 3300, 3304, 3308, 3315-3326, 3367-3379, 3418-3433, 3466-3470, 3494-3497, 3544-3545, 3598-3617, 3681-3698, 3733, 3818-3840, 3912-3913, 4006-4027, 4116-4127, 4224-4268, 4369-4387\njanitor/io.py                            24     24     0%   1-63\njanitor/math.py                          79     55    30%   31-42, 48, 57, 76-89, 95, 115-128, 153-160, 191-200\njanitor/ml.py                            15      8    47%   60-71\njanitor/spark/__init__.py                 1      1     0%   1\njanitor/spark/backend.py                 37     37     0%   3-102\njanitor/spark/functions.py               30     30     0%   5-182\njanitor/testing_utils/__init__.py         0      0   100%\njanitor/testing_utils/date_data.py        1      0   100%\njanitor/testing_utils/strategies.py      12     12     0%   5-69\njanitor/timeseries.py                    49     30    39%   46-60, 92, 96-97, 104-107, 132-147, 170-176\njanitor/utils.py                        164    129    21%   29-36, 54-60, 73-101, 105-106, 110-111, 133-136, 143-155, 177-202, 217-220, 250-251, 282-283, 304-314, 335-343, 366-372, 400-408, 423-470, 490-539\njanitor/xarray/__init__.py                1      0   100%\njanitor/xarray/functions.py              16      7    56%   71-86, 128-130\n-------------------------------------------------------------------\nTOTAL                                  1354   1069    21%\n=========================== short test summary info ============================\nPASSED tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_decreasing\n======================== 1 passed, 4 warnings in 1.06s =========================\n","stderr_tail":"","stdout_sha256":"f3cb63f9695248893f424bb2f682e865bd81f032b83589c0868f4fd2dd9b973c","log_path":"~/dev/nebius-hackathon/pilot/v2-P/ericmjl__pyjanitor-728/runs/pilot-ericmjl__pyjanitor-728-65b2a91a53/logs/agent1/agent1-14.log","tree_digest":"74b6e1aad60e40b948cb1a07819cf68782fe6b9554c0935a5f7d2801205db2cb","tree_download_s":4.788963542087004,"started_at":"2026-10-03T20:16:44.613679Z","duration_s":4.888966,"timed_out":false,"image_before":"cd09b158-fc56-4d8a-9b46-d13f24992a44","image_after":"42afca67-f0cc-4d44-a8f3-a160e22cff3d","junit":{"passed":["tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_decreasing"],"failed":[],"errors":[],"skipped":[],"collection_errors":[],"failure_text":{}},"diff":null,"patch_sha256":null,"dropped_paths":[],"snapshot_sha":null}
{"receipt_id":"agent1-15","seq":15,"branch_id":"agent1","kind":"command","cmd":"/opt/receipts-2b2406fffc844d6892b10ecbd453398f/bin/busybox mkdir -p /opt/receipts/reports && python -I /opt/receipts-2b2406fffc844d6892b10ecbd453398f/receipts_pytest.py tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_strict -v -o junit_family=xunit1 -p no:cacheprovider -rA --continue-on-collection-errors --junitxml=/opt/receipts/reports/agent1-15.xml","path":null,"exit_code":1,"stdout_tail":"dex duplication handling\"\"\"\n        df = timeseries_dataframe.shuffle(reset_index=False)\n        random_number = randint(1, len(timeseries_dataframe))\n>       df = df.append(\n            df.loc[df.index[random_number], :]\n        ).sort_timestamps_monotonically(direction=\"increasing\", strict=True)\n\ntests/timeseries/test_sort_timestamps_monotonically.py:49: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself =                        v1\n2019-01-14 13:00:00  1967\n2019-01-13 08:00:00    28\n2019-01-14 10:00:00   715\n2019-02-09 12:...1 06:00:00  1057\n2019-01-19 02:00:00  1404\n2019-02-09 01:00:00  1854\n2019-01-07 17:00:00   632\n\n[1000 rows x 1 columns]\nname = 'append'\n\n    @final\n    def __getattr__(self, name: str):\n        \"\"\"\n        After regular attribute access, try looking up the name\n        This allows simpler access to columns for interactive use.\n        \"\"\"\n        # Note: obj.x will always call obj.__getattribute__('x') prior to\n        # calling obj.__getattr__('x').\n        if (\n            name not in self._internal_names_set\n            and name not in self._metadata\n            and name not in self._accessors\n            and self._info_axis._can_hold_identifiers_and_holds_name(name)\n        ):\n            return self[name]\n>       return object.__getattribute__(self, name)\nE       AttributeError: 'DataFrame' object has no attribute 'append'. Did you mean: '_append'?\n\n/usr/local/lib/python3.10/site-packages/pandas/core/generic.py:6321: AttributeError\n=============================== warnings summary ===============================\ntests/timeseries/test_sort_timestamps_monotonically.py:27\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:27: PytestUnknownMarkWarning: Unknown pytest.mark.timeseries - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html\n    @pytest.mark.timeseries\n\ntests/timeseries/test_sort_timestamps_monotonically.py:36\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:36: PytestUnknownMarkWarning: Unknown pytest.mark.timeseries - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html\n    @pytest.mark.timeseries\n\ntests/timeseries/test_sort_timestamps_monotonically.py:44\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:44: PytestUnknownMarkWarning: Unknown pytest.mark.timeseries - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html\n    @pytest.mark.timeseries\n\ntests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_strict\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:13: FutureWarning: 'H' is deprecated and will be removed in a future version, please use 'h' instead.\n    ts_index = pd.date_range(\"1/1/2019\", periods=1000, freq=\"1H\")\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n----------- generated xml file: /opt/receipts/reports/agent1-15.xml ------------\n================================ tests coverage ================================\n_______________ coverage: platform linux, python 3.10.19-final-0 _______________\n\nName                                  Stmts   Miss  Cover   Missing\n-------------------------------------------------------------------\njanitor/__init__.py                      12      3    75%   4-5, 21\njanitor/biology.py                       14     14     0%   5-84\njanitor/chemistry.py                     73     73     0%   5-461\njanitor/engineering.py                   21     21     0%   5-106\njanitor/errors.py                         2      0   100%\njanitor/finance.py                       85     85     0%   5-654\njanitor/functions.py                    718    535    25%   90-134, 180-223, 287-308, 313-325, 330, 346-347, 355-358, 366, 404-410, 445-446, 480-495, 534-548, 583-585, 614-616, 657-667, 717-727, 761-766, 800-806, 838-842, 878-890, 929-934, 975-985, 1076-1124, 1189-1193, 1252-1255, 1432-1469, 1515-1524, 1548, 1585-1600, 1725-1772, 1809-1812, 1897-1929, 2044-2055, 2167-2177, 2272-2281, 2361-2385, 2461-2489, 2544-2555, 2745-2779, 2814-2844, 2909-2944, 2960-2961, 2981, 3067-3069, 3095-3109, 3164-3170, 3201-3203, 3250-3270, 3286-3295, 3300, 3304, 3308, 3315-3326, 3367-3379, 3418-3433, 3466-3470, 3496, 3544-3545, 3598-3617, 3681-3698, 3733, 3818-3840, 3912-3913, 4006-4027, 4116-4127, 4224-4268, 4369-4387\njanitor/io.py                            24     24     0%   1-63\njanitor/math.py                          79     55    30%   31-42, 48, 57, 76-89, 95, 115-128, 153-160, 191-200\njanitor/ml.py                            15      8    47%   60-71\njanitor/spark/__init__.py                 1      1     0%   1\njanitor/spark/backend.py                 37     37     0%   3-102\njanitor/spark/functions.py               30     30     0%   5-182\njanitor/testing_utils/__init__.py         0      0   100%\njanitor/testing_utils/date_data.py        1      0   100%\njanitor/testing_utils/strategies.py      12     12     0%   5-69\njanitor/timeseries.py                    49     39    20%   46-60, 86-109, 132-147, 170-176\njanitor/utils.py                        164    129    21%   29-36, 54-60, 73-101, 105-106, 110-111, 133-136, 143-155, 177-202, 217-220, 250-251, 282-283, 304-314, 335-343, 366-372, 400-408, 423-470, 490-539\njanitor/xarray/__init__.py                1      0   100%\njanitor/xarray/functions.py              16      7    56%   71-86, 128-130\n-------------------------------------------------------------------\nTOTAL                                  1354   1073    21%\n=========================== short test summary info ============================\nFAILED tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_strict\n======================== 1 failed, 4 warnings in 1.26s =========================\n","stderr_tail":"","stdout_sha256":"787b7f337f3e8f2713813e6eaab6360462c9c069a3aece3ce2e55c578716df08","log_path":"~/dev/nebius-hackathon/pilot/v2-P/ericmjl__pyjanitor-728/runs/pilot-ericmjl__pyjanitor-728-65b2a91a53/logs/agent1/agent1-15.log","tree_digest":"7f85905d3b2ba7c03096c80db26d16c86a6baf1206e6364d5b017d097b796627","tree_download_s":7.341742125106975,"started_at":"2026-10-03T20:17:00.262630Z","duration_s":5.134104000000001,"timed_out":false,"image_before":"42afca67-f0cc-4d44-a8f3-a160e22cff3d","image_after":"e9f4ef08-99a3-4a87-b0a9-775338b54058","junit":{"passed":[],"failed":["tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_strict"],"errors":[],"skipped":[],"collection_errors":[],"failure_text":{"tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_strict":"[...]ject has no attribute 'append'. Did you mean: '_append'?\ntimeseries_dataframe =                        v1\n2019-01-01 00:00:00  1690\n2019-01-01 01:00:00   743\n2019-01-01 02:00:00  1337\n2019-01-01 03:...1 12:00:00  1271\n2019-02-11 13:00:00  1320\n2019-02-11 14:00:00  1051\n2019-02-11 15:00:00  1642\n\n[1000 rows x 1 columns]\n\n    @pytest.mark.timeseries\n    def test_sort_timestamps_monotonically_strict(timeseries_dataframe):\n        \"\"\"Test sort_timestamps_monotonically for index duplication handling\"\"\"\n        df = timeseries_dataframe.shuffle(reset_index=False)\n        random_number = randint(1, len(timeseries_dataframe))\n>       df = df.append(\n            df.loc[df.index[random_number], :]\n        ).sort_timestamps_monotonically(direction=\"increasing\", strict=True)\n\ntests/timeseries/test_sort_timestamps_monotonically.py:49: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself =                        v1\n2019-01-14 13:00:00  1967\n2019-01-13 08:00:00    28\n2019-01-14 10:00:00   715\n2019-02-09 12:...1 06:00:00  1057\n2019-01-19 02:00:00  1404\n2019-02-09 01:00:00  1854\n2019-01-07 17:00:00   632\n\n[1000 rows x 1 columns]\nname = 'append'\n\n    @final\n    def __getattr__(self, name: str):\n        \"\"\"\n        After regular attribute access, try looking up the name\n        This allows simpler access to columns for interactive use.\n        \"\"\"\n        # Note: obj.x will always call obj.__getattribute__('x') prior to\n        # calling obj.__getattr__('x').\n        if (\n            name not in self._internal_names_set\n            and name not in self._metadata\n            and name not in self._accessors\n            and self._info_axis._can_hold_identifiers_and_holds_name(name)\n        ):\n            return self[name]\n>       return object.__getattribute__(self, name)\nE       AttributeError: 'DataFrame' object has no attribute 'append'. Did you mean: '_append'?\n\n/usr/local/lib/python3.10/site-packages/pandas/core/generic.py:6321: AttributeError"}},"diff":null,"patch_sha256":null,"dropped_paths":[],"snapshot_sha":null}
{"receipt_id":"agent1-16","seq":16,"branch_id":"agent1","kind":"command","cmd":"python -c \"import pandas as pd; print(pd.__version__); df = pd.DataFrame({'a': [1]}); print(hasattr(df, 'append'))\"","path":null,"exit_code":0,"stdout_tail":"2.3.3\nFalse\n","stderr_tail":"","stdout_sha256":"b3b53d4c00c093feeb0780c74a25d2f874fb44c7bcdb99413937c1b7c9ec399a","log_path":"~/dev/nebius-hackathon/pilot/v2-P/ericmjl__pyjanitor-728/runs/pilot-ericmjl__pyjanitor-728-65b2a91a53/logs/agent1/agent1-16.log","tree_digest":null,"tree_download_s":null,"started_at":"2026-10-03T20:17:19.618517Z","duration_s":0.587378,"timed_out":false,"image_before":"e9f4ef08-99a3-4a87-b0a9-775338b54058","image_after":"56254e6c-b9b4-4403-96ae-39f7b15c3502","junit":null,"diff":null,"patch_sha256":null,"dropped_paths":[],"snapshot_sha":null}
{"receipt_id":"agent1-17","seq":17,"branch_id":"agent1","kind":"command","cmd":"python -c \"import pandas as pd; df = pd.DataFrame({'a': [1]}); print(hasattr(df, '_append')); result = df._append(df.iloc[0]); print(len(result))\"","path":null,"exit_code":0,"stdout_tail":"True\n2\n","stderr_tail":"","stdout_sha256":"e203152486f2e180b5a318850ef3202114d2dcc0dee1ba598153b7e61dad9ab7","log_path":"~/dev/nebius-hackathon/pilot/v2-P/ericmjl__pyjanitor-728/runs/pilot-ericmjl__pyjanitor-728-65b2a91a53/logs/agent1/agent1-17.log","tree_digest":null,"tree_download_s":null,"started_at":"2026-10-03T20:17:25.548464Z","duration_s":0.583541,"timed_out":false,"image_before":"56254e6c-b9b4-4403-96ae-39f7b15c3502","image_after":"b5ef404e-b6b7-4d4f-80a1-331c4e2dd10f","junit":null,"diff":null,"patch_sha256":null,"dropped_paths":[],"snapshot_sha":null}
{"receipt_id":"agent1-18","seq":18,"branch_id":"agent1","kind":"command","cmd":"/opt/receipts-f39ce82f18b7451fad7c110e6a0c8220/bin/busybox mkdir -p /opt/receipts/reports && python -I /opt/receipts-f39ce82f18b7451fad7c110e6a0c8220/receipts_pytest.py tests/timeseries/test_sort_timestamps_monotonically.py -v -o junit_family=xunit1 -p no:cacheprovider -rA --continue-on-collection-errors --junitxml=/opt/receipts/reports/agent1-18.xml","path":null,"exit_code":1,"stdout_tail":"0  1273\n2019-01-27 07:00:00  1456\n2019-02-10 14:00:00   509\n2019-01-09 10:...9 15:00:00   395\n2019-01-07 09:00:00   128\n2019-01-24 02:00:00  1767\n2019-01-22 22:00:00  1967\n\n[1000 rows x 1 columns]\nname = 'append'\n\n    @final\n    def __getattr__(self, name: str):\n        \"\"\"\n        After regular attribute access, try looking up the name\n        This allows simpler access to columns for interactive use.\n        \"\"\"\n        # Note: obj.x will always call obj.__getattribute__('x') prior to\n        # calling obj.__getattr__('x').\n        if (\n            name not in self._internal_names_set\n            and name not in self._metadata\n            and name not in self._accessors\n            and self._info_axis._can_hold_identifiers_and_holds_name(name)\n        ):\n            return self[name]\n>       return object.__getattribute__(self, name)\nE       AttributeError: 'DataFrame' object has no attribute 'append'. Did you mean: '_append'?\n\n/usr/local/lib/python3.10/site-packages/pandas/core/generic.py:6321: AttributeError\n=============================== warnings summary ===============================\ntests/timeseries/test_sort_timestamps_monotonically.py:27\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:27: PytestUnknownMarkWarning: Unknown pytest.mark.timeseries - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html\n    @pytest.mark.timeseries\n\ntests/timeseries/test_sort_timestamps_monotonically.py:36\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:36: PytestUnknownMarkWarning: Unknown pytest.mark.timeseries - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html\n    @pytest.mark.timeseries\n\ntests/timeseries/test_sort_timestamps_monotonically.py:44\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:44: PytestUnknownMarkWarning: Unknown pytest.mark.timeseries - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html\n    @pytest.mark.timeseries\n\ntests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically\ntests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_decreasing\ntests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_strict\n  /pyjanitor/tests/timeseries/test_sort_timestamps_monotonically.py:13: FutureWarning: 'H' is deprecated and will be removed in a future version, please use 'h' instead.\n    ts_index = pd.date_range(\"1/1/2019\", periods=1000, freq=\"1H\")\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n==================================== PASSES ====================================\n----------- generated xml file: /opt/receipts/reports/agent1-18.xml ------------\n================================ tests coverage ================================\n_______________ coverage: platform linux, python 3.10.19-final-0 _______________\n\nName                                  Stmts   Miss  Cover   Missing\n-------------------------------------------------------------------\njanitor/__init__.py                      12      3    75%   4-5, 21\njanitor/biology.py                       14     14     0%   5-84\njanitor/chemistry.py                     73     73     0%   5-461\njanitor/engineering.py                   21     21     0%   5-106\njanitor/errors.py                         2      0   100%\njanitor/finance.py                       85     85     0%   5-654\njanitor/functions.py                    718    535    25%   90-134, 180-223, 287-308, 313-325, 330, 346-347, 355-358, 366, 404-410, 445-446, 480-495, 534-548, 583-585, 614-616, 657-667, 717-727, 761-766, 800-806, 838-842, 878-890, 929-934, 975-985, 1076-1124, 1189-1193, 1252-1255, 1432-1469, 1515-1524, 1548, 1585-1600, 1725-1772, 1809-1812, 1897-1929, 2044-2055, 2167-2177, 2272-2281, 2361-2385, 2461-2489, 2544-2555, 2745-2779, 2814-2844, 2909-2944, 2960-2961, 2981, 3067-3069, 3095-3109, 3164-3170, 3201-3203, 3250-3270, 3286-3295, 3300, 3304, 3308, 3315-3326, 3367-3379, 3418-3433, 3466-3470, 3496, 3544-3545, 3598-3617, 3681-3698, 3733, 3818-3840, 3912-3913, 4006-4027, 4116-4127, 4224-4268, 4369-4387\njanitor/io.py                            24     24     0%   1-63\njanitor/math.py                          79     55    30%   31-42, 48, 57, 76-89, 95, 115-128, 153-160, 191-200\njanitor/ml.py                            15      8    47%   60-71\njanitor/spark/__init__.py                 1      1     0%   1\njanitor/spark/backend.py                 37     37     0%   3-102\njanitor/spark/functions.py               30     30     0%   5-182\njanitor/testing_utils/__init__.py         0      0   100%\njanitor/testing_utils/date_data.py        1      0   100%\njanitor/testing_utils/strategies.py      12     12     0%   5-69\njanitor/timeseries.py                    49     30    39%   46-60, 92, 96-97, 104-107, 132-147, 170-176\njanitor/utils.py                        164    129    21%   29-36, 54-60, 73-101, 105-106, 110-111, 133-136, 143-155, 177-202, 217-220, 250-251, 282-283, 304-314, 335-343, 366-372, 400-408, 423-470, 490-539\njanitor/xarray/__init__.py                1      0   100%\njanitor/xarray/functions.py              16      7    56%   71-86, 128-130\n-------------------------------------------------------------------\nTOTAL                                  1354   1064    21%\n=========================== short test summary info ============================\nPASSED tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically\nPASSED tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_decreasing\nFAILED tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_strict\n=================== 1 failed, 2 passed, 6 warnings in 1.26s ====================\n","stderr_tail":"","stdout_sha256":"21c3677409547fbac6ae72a059d9c1708edb7ca42e54b1e705e8a292fc11ccbd","log_path":"~/dev/nebius-hackathon/pilot/v2-P/ericmjl__pyjanitor-728/runs/pilot-ericmjl__pyjanitor-728-65b2a91a53/logs/agent1/agent1-18.log","tree_digest":"97c21e20971eb87c62a6f0fccd52de239f8324c82dea315dc382861e55a30770","tree_download_s":16.135632042074576,"started_at":"2026-10-03T20:17:29.497289Z","duration_s":5.1019890000000006,"timed_out":false,"image_before":"b5ef404e-b6b7-4d4f-80a1-331c4e2dd10f","image_after":"3aa4e618-99e5-40ca-b8bb-aeaa715b1fb9","junit":{"passed":["tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically","tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_decreasing"],"failed":["tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_strict"],"errors":[],"skipped":[],"collection_errors":[],"failure_text":{"tests/timeseries/test_sort_timestamps_monotonically.py::test_sort_timestamps_monotonically_strict":"[...]ject has no attribute 'append'. Did you mean: '_append'?\ntimeseries_dataframe =                        v1\n2019-01-01 00:00:00   644\n2019-01-01 01:00:00   768\n2019-01-01 02:00:00  1824\n2019-01-01 03:...1 12:00:00   448\n2019-02-11 13:00:00   944\n2019-02-11 14:00:00  1927\n2019-02-11 15:00:00   207\n\n[1000 rows x 1 columns]\n\n    @pytest.mark.timeseries\n    def test_sort_timestamps_monotonically_strict(timeseries_dataframe):\n        \"\"\"Test sort_timestamps_monotonically for index duplication handling\"\"\"\n        df = timeseries_dataframe.shuffle(reset_index=False)\n        random_number = randint(1, len(timeseries_dataframe))\n>       df = df.append(\n            df.loc[df.index[random_number], :]\n        ).sort_timestamps_monotonically(direction=\"increasing\", strict=True)\n\ntests/timeseries/test_sort_timestamps_monotonically.py:49: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself =                        v1\n2019-01-26 05:00:00  1273\n2019-01-27 07:00:00  1456\n2019-02-10 14:00:00   509\n2019-01-09 10:...9 15:00:00   395\n2019-01-07 09:00:00   128\n2019-01-24 02:00:00  1767\n2019-01-22 22:00:00  1967\n\n[1000 rows x 1 columns]\nname = 'append'\n\n    @final\n    def __getattr__(self, name: str):\n        \"\"\"\n        After regular attribute access, try looking up the name\n        This allows simpler access to columns for interactive use.\n        \"\"\"\n        # Note: obj.x will always call obj.__getattribute__('x') prior to\n        # calling obj.__getattr__('x').\n        if (\n            name not in self._internal_names_set\n            and name not in self._metadata\n            and name not in self._accessors\n            and self._info_axis._can_hold_identifiers_and_holds_name(name)\n        ):\n            return self[name]\n>       return object.__getattribute__(self, name)\nE       AttributeError: 'DataFrame' object has no attribute 'append'. Did you mean: '_append'?\n\n/usr/local/lib/python3.10/site-packages/pandas/core/generic.py:6321: AttributeError"}},"diff":null,"patch_sha256":null,"dropped_paths":[],"snapshot_sha":null}
{"receipt_id":"agent1-19","seq":19,"branch_id":"agent1","kind":"diff","cmd":"compute patch in executor staging agent1-42be9d087e5741c39352e5ba7e49ea00: /opt/homebrew/Cellar/git/2.53.0/bin/git -c core.hooksPath=/dev/null -c core.attributesFile=/dev/null -c diff.external= -c core.quotePath=false add -A && /opt/homebrew/Cellar/git/2.53.0/bin/git -c core.hooksPath=/dev/null -c core.attributesFile=/dev/null -c diff.external= -c core.quotePath=false diff --cached --binary --no-ext-diff --no-textconv --no-renames f1caf8acebd9a22ac11827c5dd717de1c5362283","path":null,"exit_code":0,"stdout_tail":"diff --git a/janitor/timeseries.py b/janitor/timeseries.py\nindex 5e1a99d..83836b3 100644\n--- a/janitor/timeseries.py\n+++ b/janitor/timeseries.py\n@@ -60,6 +60,93 @@ def fill_missing_timestamps(\n     return df.reindex(expected_timestamps)\n \n \n+@pf.register_dataframe_method\n+def sort_timestamps_monotonically(\n+    df: pd.DataFrame,\n+    column_name: str = None,\n+    direction: str = \"increasing\",\n+    strict: bool = False,\n+) -> pd.DataFrame:\n+    \"\"\"\n+    Sorts data frame monotonically.\n+    It assumes the data frame has an index of type pd.DateTimeIndex when index is datetime.\n+    If datetime is in a column, then the column is expected to be of type pd.Timestamp\n+\n+    :param df: data frame to sort monotonically\n+    :param column_name: needs to be specified if and only if the date time is not in index.\n+        Defaults to None\n+    :param direction: specifies the direction in which monotonicity is being tested for.\n+        Defaults to 'increasing'\n+    :param strict: whether to drop duplicates after sorting\n+    :return: data frame with its index sorted\n+    \"\"\"\n+    # Handle case where column_name is actually a direction value\n+    # This supports calling df.sort_timestamps_monotonically(\"decreasing\") \n+    # as shorthand for df.sort_timestamps_monotonically(direction=\"decreasing\")\n+    if column_name is not None and column_name not in df.columns:\n+        if column_name in (\"increasing\", \"decreasing\"):\n+            # Treat as direction instead\n+            direction = column_name\n+            column_name = None\n+        else:\n+            raise KeyError(f\"Column '{column_name}' not found in DataFrame\")\n+    \n+    if column_name is not None:\n+        # Sort by the specified column\n+        ascending = direction == \"increasing\"\n+        result_df = df.sort_values(by=column_name, ascending=ascending)\n+    else:\n+        # Sort by index\n+        ascending = direction == \"increasing\"\n+        result_df = df.sort_index(ascending=ascending)\n+    \n+    if strict:\n+        if column_name is not None:\n+            result_df = result_df.drop_duplicates(subset=[column_name], keep='first')\n+        else:\n+            result_df = result_df[~result_df.index.duplicated(keep='first')]\n+            \n+    return result_df\n+\n+\n+@pf.register_dataframe_method\n+def test_for_monotonicity(\n+    df: pd.DataFrame,\n+    column_name: str = None,\n+    direction: str = \"increasing\",\n+) -> bool:\n+    \"\"\"\n+    Tests input data frame for monotonicity.\n+\n+    Check if the data is monotonically increasing or decreasing.\n+    Direction is dependent on user input.\n+    Defaults to increasing\n+\n+    :param df: data frame to be tested for monotonicity\n+    :param column_name: needs to be specified if and only if the date time is not in index.\n+        Defaults to None.\n+    :param direction: specifies the direction in which monotonicity is being tested for.\n+        Defaults to 'increasing'\n+    :return: single boolean flag indicating whether the test has passed or not\n+    \"\"\"\n+    if column_name is not None:\n+        if column_name not in df.columns:\n+            raise KeyError(f\"Column '{column_name}' not found in DataFrame\")\n+        series = df[column_name]\n+    else:\n+        series = df.index\n+\n+    if not isinstance(series, (pd.DatetimeIndex, pd.Series)):\n+        raise TypeError(\"Series must be DatetimeIndex or Series containing timestamps\")\n+\n+    if direction == \"increasing\":\n+        return series.is_monotonic_increasing\n+    elif direction == \"decreasing\":\n+        return series.is_monotonic_decreasing\n+    else:\n+        raise ValueError(\"Direction must be either 'increasing' or 'decreasing'\")\n+\n+\n def _get_missing_timestamps(\n     df: pd.DataFrame,\n     frequency: str,\n","stderr_tail":"","stdout_sha256":"57f20a0248f3cf794cdea9e26c8c65a3c1f25040293ba7d575f2aea739b9fb9f","log_path":null,"tree_digest":"97c21e20971eb87c62a6f0fccd52de239f8324c82dea315dc382861e55a30770","tree_download_s":4.121960499789566,"started_at":"2026-10-03T20:18:08.628977Z","duration_s":0.09422808303497732,"timed_out":false,"image_before":"3aa4e618-99e5-40ca-b8bb-aeaa715b1fb9","image_after":"3aa4e618-99e5-40ca-b8bb-aeaa715b1fb9","junit":null,"diff":{"files":[{"path":"janitor/timeseries.py","added":87,"deleted":0,"category":"source","status":"modified"}],"patch_sha256":"57f20a0248f3cf794cdea9e26c8c65a3c1f25040293ba7d575f2aea739b9fb9f","patch_path":"~/dev/nebius-hackathon/pilot/v2-P/ericmjl__pyjanitor-728/runs/pilot-ericmjl__pyjanitor-728-65b2a91a53/artifacts/agent1/agent1-19.patch"},"patch_sha256":"57f20a0248f3cf794cdea9e26c8c65a3c1f25040293ba7d575f2aea739b9fb9f","dropped_paths":[],"snapshot_sha":"f1caf8acebd9a22ac11827c5dd717de1c5362283"}
