diff --git a/docs/api/changelog.rst b/docs/api/changelog.rst index 5a46fabc6..2fc2228bf 100644 --- a/docs/api/changelog.rst +++ b/docs/api/changelog.rst @@ -44,6 +44,8 @@ Fixed - Fixed bug where :func:`imod.evaluate.convert_pointwaterhead_freshwaterhead` produced incorrect results when point water heads were below elevation levels for unstructured grids. +- Support pandas 3.0. + Changed ~~~~~~~ diff --git a/examples/imod-wq/Henry-wq.py b/examples/imod-wq/Henry-wq.py index f3751e129..38b5b0b9b 100644 --- a/examples/imod-wq/Henry-wq.py +++ b/examples/imod-wq/Henry-wq.py @@ -102,7 +102,7 @@ ) m["oc"] = imod.wq.OutputControl(save_head_idf=True, save_concentration_idf=True) m.create_time_discretization( - additional_times=pd.date_range("2000-01-01", "2001-01-01", freq="M") + additional_times=pd.date_range("2000-01-01", "2001-01-01", freq="ME") ) # %% diff --git a/examples/mf6/circle_transport.py b/examples/mf6/circle_transport.py index b802e939e..7c0f8aeda 100644 --- a/examples/mf6/circle_transport.py +++ b/examples/mf6/circle_transport.py @@ -194,7 +194,7 @@ # stress period is a year long. We can then use the "last" keyword in the output # control to save the output. -simtimes = pd.date_range(start="2000-01-01", end="2030-01-01", freq="As") +simtimes = pd.date_range(start="2000-01-01", end="2030-01-01", freq="YS") simulation.create_time_discretization(additional_times=simtimes) # %% diff --git a/examples/mf6/hondsrug.py b/examples/mf6/hondsrug.py index b855c4e04..806e3fcda 100644 --- a/examples/mf6/hondsrug.py +++ b/examples/mf6/hondsrug.py @@ -336,7 +336,7 @@ def outer_edge(da): # resampled to a yearly step by using the xarray function # `Dataset.resample `_. -rch_trans_yr = rch_trans.resample(time="A", label="left").mean() +rch_trans_yr = rch_trans.resample(time="YS", label="left").mean() rch_trans_yr # %% diff --git a/imod/evaluate/constraints.py b/imod/evaluate/constraints.py index ad13c4367..2b9573370 100644 --- a/imod/evaluate/constraints.py +++ b/imod/evaluate/constraints.py @@ -126,7 +126,8 @@ def stability_constraint_advection(front, lower, right, top_bot, porosity=0.3, R dt = 1.0 / (1.0 / dt_x + 1.0 / dt_y + 1.0 / dt_z) dt_xyz = xr.concat( - (dt_x, dt_y, dt_z), dim=pd.Index(["x", "y", "z"], name="direction") + (dt_x, dt_y, dt_z), + dim=pd.Index(["x", "y", "z"], name="direction", dtype="object"), ) return dt, dt_xyz @@ -254,9 +255,11 @@ def _get_stage_name(sid): if not drop_allnan or not dt.isnull().all(): results.append(dt) resultids.append(comb) - dt_all = xr.concat( - results, pd.Index(resultids, name="combination"), coords="minimal" - ) + # Set index to object dtype to work around xarray concat issue where + # StringDtype could not be interpreted as a data type with pandas 3.0 (as + # np.dtype is called.) + id_index = pd.Index(resultids, name="combination", dtype="object") + dt_all = xr.concat(results, id_index, coords="minimal") # overall dt dt_min = dt_all.min(dim="combination") diff --git a/imod/formats/gen/gen.py b/imod/formats/gen/gen.py index d1006cf34..ce2ffde30 100644 --- a/imod/formats/gen/gen.py +++ b/imod/formats/gen/gen.py @@ -267,7 +267,7 @@ def read_binary(path: Union[str, Path]) -> "geopandas.GeoDataFrame": # type: ig else: df = pd.DataFrame() df["feature_type"] = feature_type - df["feature_type"] = df["feature_type"].replace(GENTYPE_TO_NAME) + df["feature_type"] = df["feature_type"].replace(GENTYPE_TO_NAME).astype(str) geometry = [] for ftype, geom in zip(feature_type, xy): diff --git a/imod/formats/ipf.py b/imod/formats/ipf.py index 0d6ff861e..e5c8d7cb9 100644 --- a/imod/formats/ipf.py +++ b/imod/formats/ipf.py @@ -458,7 +458,8 @@ def write_assoc(path, df, itype=1, nodata=1.0e20, assoc_columns=None): # The reason is that datetime columns are converted to string as well # and then quoted. This causes trouble with some iMOD(batch) functions. for column in df.columns: - if df.loc[:, column].dtype == np.dtype("O"): + # Test for strings compatible with pandas 2 and 3 + if pd.api.types.is_string_dtype(df[column].dtype): df.loc[:, column] = df.loc[:, column].astype(str) df.loc[:, column] = '"' + df.loc[:, column] + '"' @@ -509,7 +510,8 @@ def write(path, df, indexcolumn=0, assoc_ext="txt", nodata=1.0e20): # The reason is that datetime columns are converted to string as well # and then quoted. This causes trouble with some iMOD(batch) functions. for column in df.columns: - if df.loc[:, column].dtype == np.dtype("O"): + # Test for strings compatible with pandas 2 and 3 + if pd.api.types.is_string_dtype(df[column].dtype): df.loc[:, column] = df.loc[:, column].astype(str) df.loc[:, column] = '"' + df.loc[:, column] + '"' diff --git a/imod/mf6/multimodel/exchange_creator.py b/imod/mf6/multimodel/exchange_creator.py index 31a55e6a8..f10548f5b 100644 --- a/imod/mf6/multimodel/exchange_creator.py +++ b/imod/mf6/multimodel/exchange_creator.py @@ -290,10 +290,12 @@ def rearrange_connected_cells(self): label_decreasing = df["cell_label1"] > df["cell_label2"] - colnames = ["cell_idx1", "cell_idx2", "cell_label1", "cell_label2"] - colnames_reversed = ["cell_idx2", "cell_idx1", "cell_label2", "cell_label1"] + if label_decreasing.any(): + colnames = ["cell_idx1", "cell_idx2", "cell_label1", "cell_label2"] + colnames_reversed = ["cell_idx2", "cell_idx1", "cell_label2", "cell_label1"] - decreasing_connections = df.loc[label_decreasing, colnames].values - df.loc[label_decreasing, colnames_reversed] = decreasing_connections + df_decreasing = df.loc[label_decreasing, colnames] + df_decreasing.columns = colnames_reversed + df.loc[label_decreasing, colnames_reversed] = df_decreasing self._connected_cells = df diff --git a/imod/testing.py b/imod/testing.py index 890468b9c..970603e61 100644 --- a/imod/testing.py +++ b/imod/testing.py @@ -16,7 +16,7 @@ def assert_frame_equal(left: pd.DataFrame, right: pd.DataFrame, **kwargs): def always_int64(df): df = df.copy() for column, dtype in df.dtypes.items(): - if np.issubdtype(dtype, np.integer): + if pd.api.types.is_integer_dtype(dtype): df[column] = df[column].astype(np.int64) return df diff --git a/imod/tests/test_evaluate/test_constraints.py b/imod/tests/test_evaluate/test_constraints.py index 2948d56d8..d28909296 100644 --- a/imod/tests/test_evaluate/test_constraints.py +++ b/imod/tests/test_evaluate/test_constraints.py @@ -94,13 +94,13 @@ def test_intra_cell_boundary_conditions(test_da1): riv1drn = test_da1 * (0.3 * 1.0) / min(100.0, 150) * (1.0 - 0.0) dt_min_ref = np.minimum(ghbdrn, riv1drn) - assert dt_min_ref.equals(dt_min) - assert dt_all.equals( - xr.concat( - (ghbdrn, riv1drn), pd.Index(["ghb-drn", "riv_0-drn"], name="combination") - ) + expected_index = pd.Index( + ["ghb-drn", "riv_0-drn"], name="combination", dtype="object" ) + assert dt_min_ref.equals(dt_min) + assert dt_all.equals(xr.concat((ghbdrn, riv1drn), expected_index)) + def test_intra_cell_boundary_conditions_thickness_zero(test_da1): top_bot = xr.Dataset({"top": test_da1 * -1.0, "bot": test_da1 * -1.0}) diff --git a/imod/tests/test_formats/test_gen.py b/imod/tests/test_formats/test_gen.py index 566cd1acc..7b4483266 100644 --- a/imod/tests/test_formats/test_gen.py +++ b/imod/tests/test_formats/test_gen.py @@ -160,16 +160,17 @@ def test_gen_single_feature(tmp_path, ftype): imod.gen.write(path, gdf, feature_type="feature_type") back = imod.gen.read(path) assert (back["feature_type"] == ftype).all() + geom_actual = back["geometry"] + geom_expected = gdf["geometry"] + expected = gdf.drop(columns="geometry").sort_index(axis=1) + actual = back.drop(columns="geometry").sort_index(axis=1) + # TODO: account for the fact that geopandas string type is ArrowStringArray, whereas iMOD GEN reader returns object dtype. + assert expected.equals(actual) if ftype in ("circle", "rectangle"): # Gotta do a different check, geometries won't be exactly the same - geom_actual = back["geometry"].iloc[0] - geom_expected = gdf["geometry"].iloc[0] - expected = gdf.drop(columns="geometry").sort_index(axis=1) - actual = back.drop(columns="geometry").sort_index(axis=1) - assert expected.equals(actual) - assert approximately_equal(geom_actual, geom_expected) + assert approximately_equal(geom_actual.iloc[0], geom_expected.iloc[0]) else: - assert gdf.sort_index(axis=1).equals(back.sort_index(axis=1)) + assert geom_actual.geom_equals(geom_expected).all() def test_gen_multi_feature(tmp_path): diff --git a/imod/tests/test_formats/test_prj_wel.py b/imod/tests/test_formats/test_prj_wel.py index a071f3e78..e5e535743 100644 --- a/imod/tests/test_formats/test_prj_wel.py +++ b/imod/tests/test_formats/test_prj_wel.py @@ -798,8 +798,8 @@ def test_open_projectfile_data_out_of_bounds_wells( assert actual[field] == wel_expected[field] if actual["has_associated"]: timeseries = data["wel-associated"]["dataframe"][0]["time"] - # Test if last element NaT - assert timeseries.iloc[-1] is pd.NaT + # Test if last element not NaT (since pandas 3, before it was NaT) + assert timeseries.iloc[-1] == pd.Timestamp("2999-11-12 00:00:00") @pytest.mark.unittest_jit diff --git a/imod/tests/test_mf6/test_ex01_twri.py b/imod/tests/test_mf6/test_ex01_twri.py index 17a6d38da..5709b8df5 100644 --- a/imod/tests/test_mf6/test_ex01_twri.py +++ b/imod/tests/test_mf6/test_ex01_twri.py @@ -432,7 +432,7 @@ def test_simulation_write_and_run(twri_model, tmp_path): assert head.shape == (1, 3, 15, 15) assert np.all( head["time"].values - == np.array("1999-01-02T00:00:00.000000000", dtype="datetime64[ns]") + == np.array("1999-01-02T00:00:00.000000", dtype="datetime64[ns]") ) meanhead_layer = head.groupby("layer").mean(dim=xr.ALL_DIMS) mean_answer = np.array([59.79181509, 30.44132373, 24.88576811]) diff --git a/imod/tests/test_mf6/test_mf6_drn.py b/imod/tests/test_mf6/test_mf6_drn.py index a2bba1158..62d2138aa 100644 --- a/imod/tests/test_mf6/test_mf6_drn.py +++ b/imod/tests/test_mf6/test_mf6_drn.py @@ -418,10 +418,10 @@ def test_clip_box_transient(transient_drainage): selection = drn.clip_box(time_min="2001-01-01", time_max="2004-01-01") expected = np.array( [ - "2001-01-01T00:00:00.000000000", - "2002-01-01T00:00:00.000000000", - "2003-01-01T00:00:00.000000000", - "2004-01-01T00:00:00.000000000", + "2001-01-01T00:00:00.000000", + "2002-01-01T00:00:00.000000", + "2003-01-01T00:00:00.000000", + "2004-01-01T00:00:00.000000", ], dtype="datetime64[ns]", ) @@ -434,9 +434,9 @@ def test_clip_box_transient(transient_drainage): selection = drn.clip_box(time_min="2000-06-01", time_max="2002-06-01") expected = np.array( [ - "2000-06-01T00:00:00.000000000", - "2001-01-01T00:00:00.000000000", - "2002-01-01T00:00:00.000000000", + "2000-06-01T00:00:00.000000", + "2001-01-01T00:00:00.000000", + "2002-01-01T00:00:00.000000", ], dtype="datetime64[ns]", ) @@ -447,10 +447,10 @@ def test_clip_box_transient(transient_drainage): selection = drn.clip_box(time_min="1990-06-01", time_max="2002-06-01") expected = np.array( [ - "1990-06-01T00:00:00.000000000", - "2000-01-01T00:00:00.000000000", - "2001-01-01T00:00:00.000000000", - "2002-01-01T00:00:00.000000000", + "1990-06-01T00:00:00.000000", + "2000-01-01T00:00:00.000000", + "2001-01-01T00:00:00.000000", + "2002-01-01T00:00:00.000000", ], dtype="datetime64[ns]", ) diff --git a/imod/tests/test_mf6/test_mf6_npf.py b/imod/tests/test_mf6/test_mf6_npf.py index 75f094743..c97c4188a 100644 --- a/imod/tests/test_mf6/test_mf6_npf.py +++ b/imod/tests/test_mf6/test_mf6_npf.py @@ -303,10 +303,8 @@ def test_npf_from_imod5_settings(imod5_dataset, tmp_path): # move the coordinates a bit so that it doesn't match the grid of k (and the regridding settings will matter) target_grid = data["khv"]["kh"] x = target_grid["x"].values - x += 50 y = target_grid["y"].values - y += 50 - target_grid = target_grid.assign_coords({"x": x, "y": y}) + target_grid = target_grid.assign_coords({"x": x + 50, "y": y + 50}) settings = imod.mf6.NodePropertyFlow.get_regrid_methods() settings_1 = deepcopy(settings) diff --git a/imod/tests/test_mf6/test_mf6_out.py b/imod/tests/test_mf6/test_mf6_out.py index a0867985d..e3b412b10 100644 --- a/imod/tests/test_mf6/test_mf6_out.py +++ b/imod/tests/test_mf6/test_mf6_out.py @@ -434,7 +434,7 @@ def test_open_cbc__dis_datetime(transient_twri_result): ) for array in cbc.values(): - assert array.coords["time"].dtype == np.dtype("datetime64[ns]") + assert array.coords["time"].dtype == np.dtype("datetime64[us]") def test_open_cbc__dis_transient_unconfined(transient_unconfined_twri_result): @@ -535,7 +535,7 @@ def test_open_cbc__disv_datetime(circle_result): ) for array in cbc.values(): - assert array.coords["time"].dtype == np.dtype("datetime64[ns]") + assert array.coords["time"].dtype == np.dtype("datetime64[us]") def test_open_cbc__disv_sto(circle_result_sto): diff --git a/imod/tests/test_mf6/test_mf6_rch.py b/imod/tests/test_mf6/test_mf6_rch.py index ae8c8037f..16fef6bb9 100644 --- a/imod/tests/test_mf6/test_mf6_rch.py +++ b/imod/tests/test_mf6/test_mf6_rch.py @@ -409,7 +409,8 @@ def test_planar_rch_from_imod5_constant(imod5_dataset, tmp_path): target_discretization = StructuredDiscretization.from_imod5_data(data) # create a planar grid with time-independent recharge - data["rch"]["rate"]["layer"].values[0] = -1 + data["rch"]["rate"] = data["rch"]["rate"].assign_coords(layer=[-1]) + assert not is_transient_data_grid(data["rch"]["rate"]) assert is_planar_grid(data["rch"]["rate"]) @@ -432,7 +433,7 @@ def test_planar_rch_from_imod5_constant(imod5_dataset, tmp_path): assert "maxbound 33856" in rendered_rch assert rendered_rch.count("begin period") == 1 # teardown - data["rch"]["rate"]["layer"].values[0] = 1 + data["rch"]["rate"] = data["rch"]["rate"].assign_coords(layer=[1]) @pytest.mark.unittest_jit diff --git a/imod/tests/test_mf6/test_mf6_simulation.py b/imod/tests/test_mf6/test_mf6_simulation.py index 06a9be30c..945fe1871 100644 --- a/imod/tests/test_mf6/test_mf6_simulation.py +++ b/imod/tests/test_mf6/test_mf6_simulation.py @@ -211,7 +211,7 @@ def test_simulation_open_head(circle_model, tmp_path): ) assert head.dims == ("time", "layer", "mesh2d_nFaces") assert head.shape == (52, 2, 216) - assert str(head.coords["time"].values[()][0]) == "2013-04-29T22:00:00.000000000" + assert str(head.coords["time"].values[()][0]) == "2013-04-29T22:00:00.000000" class PathCases: diff --git a/imod/tests/test_mf6/test_mf6_timedis.py b/imod/tests/test_mf6/test_mf6_timedis.py index 20c1ecda6..baf01670d 100644 --- a/imod/tests/test_mf6/test_mf6_timedis.py +++ b/imod/tests/test_mf6/test_mf6_timedis.py @@ -22,7 +22,7 @@ def test_render(): """\ begin options time_units days - start_date_time 2000-01-01T00:00:00.000000000 + start_date_time 2000-01-01T00:00:00.000000 end options begin dimensions diff --git a/imod/tests/test_mf6/test_mf6_transport_model.py b/imod/tests/test_mf6/test_mf6_transport_model.py index c95f048ac..50600b8ae 100644 --- a/imod/tests/test_mf6/test_mf6_transport_model.py +++ b/imod/tests/test_mf6/test_mf6_transport_model.py @@ -153,7 +153,7 @@ def test_transport_concentration_loading(tmp_path, flow_transport_simulation): simulation_start_time="2000-01-31", time_unit="s", ) - assert conc_time.coords["time"].dtype == np.dtype("datetime64[ns]") + assert conc_time.coords["time"].dtype == np.dtype("datetime64[us]") def test_transport_balance_loading(tmp_path, flow_transport_simulation): @@ -170,7 +170,7 @@ def test_transport_balance_loading(tmp_path, flow_transport_simulation): simulation_start_time="2000-01-31", time_unit="s", ) - assert balance_time.coords["time"].dtype == np.dtype("datetime64[ns]") + assert balance_time.coords["time"].dtype == np.dtype("datetime64[us]") np.testing.assert_allclose( balance_notime.sel(species="a")["source-sink mix_ssm"].values, diff --git a/imod/tests/test_mf6/test_mf6_wel.py b/imod/tests/test_mf6/test_mf6_wel.py index 22d06307f..c37f71e7d 100644 --- a/imod/tests/test_mf6/test_mf6_wel.py +++ b/imod/tests/test_mf6/test_mf6_wel.py @@ -883,7 +883,9 @@ def test_import_and_convert_to_mf6(imod5_dataset, tmp_path, wel_class): wel = wel_class.from_imod5_data("wel-WELLS_L3", data, times, minimum_thickness=1.0) assert wel.dataset["x"].values[0] == 197910.0 assert wel.dataset["y"].values[0] == 362860.0 - assert np.mean(wel.dataset["rate"].values) == -317.2059091946156 + np.testing.assert_almost_equal( + np.mean(wel.dataset["rate"].values), -317.2059091946156 + ) # convert to a gridded well top = target_dis.dataset["top"] bottom = target_dis.dataset["bottom"] @@ -895,7 +897,9 @@ def test_import_and_convert_to_mf6(imod5_dataset, tmp_path, wel_class): assert len(mf6_well.dataset["x"].values) == 1 assert mf6_well.dataset["x"].values[0] == 197910.0 assert mf6_well.dataset["y"].values[0] == 362860.0 - assert np.mean(mf6_well.dataset["rate"].values) == -317.2059091946156 + np.testing.assert_almost_equal( + np.mean(mf6_well.dataset["rate"].values), -317.2059091946156 + ) # write the package for validation write_context = WriteContext(simulation_directory=tmp_path) diff --git a/imod/tests/test_typing/test_typing_grid.py b/imod/tests/test_typing/test_typing_grid.py index 449af956f..de122616b 100644 --- a/imod/tests/test_typing/test_typing_grid.py +++ b/imod/tests/test_typing/test_typing_grid.py @@ -95,11 +95,11 @@ def test_is_planar_grid(basic_dis, basic_unstructured_dis): assert not is_planar_grid(bottom_layer) # set layer coordinates as present and 0 - bottom_layer.coords["layer"].values[0] = 0 + bottom_layer = bottom_layer.assign_coords(layer=[0]) assert is_planar_grid(bottom_layer) # set layer coordinates as present and -1 - bottom_layer.coords["layer"].values[0] = -1 + bottom_layer = bottom_layer.assign_coords(layer=[-1]) assert is_planar_grid(bottom_layer) @@ -120,7 +120,7 @@ def test_has_negative_layer(basic_dis, basic_unstructured_dis): assert not has_negative_layer(bottom_layer) # set layer coordinates as present and -1 - bottom_layer.coords["layer"].values[0] = -1 + bottom_layer = bottom_layer.assign_coords(layer=[-1]) assert has_negative_layer(bottom_layer) diff --git a/imod/tests/test_util/test_util_time.py b/imod/tests/test_util/test_util_time.py index 81d3e62c5..90014b242 100644 --- a/imod/tests/test_util/test_util_time.py +++ b/imod/tests/test_util/test_util_time.py @@ -4,6 +4,7 @@ import numpy as np import pandas as pd import pytest +from pytest_cases import parametrize_with_cases import imod from imod.util.time import _check_year, forcing_starts_ends, to_datetime_internal @@ -138,3 +139,35 @@ def test_forcing__irregular_day(): package_times=package_times, globaltimes=globaltimes ) assert starts_ends == ["1", "2:4", "5", "6"] + + +class DateTimeCases: + def case_Y(self): + return ["2000", "2001", "9999"] + + def case_Ymd(self): + return ["20000101", "20000102", "99990101"] + + def case_YmdH(self): + return ["2000010100", "2000010200", "9999010100"] + + def case_YmdHM(self): + return ["200001010000", "200001020000", "999901010000"] + + def case_YmdHMS(self): + return ["20000101000000", "20000102000000", "99990101000000"] + + +@parametrize_with_cases("datestr", cases=DateTimeCases) +def test_to_pandas_datetime_series(datestr): + """ + Test whether behavior of pandas stays similar to the past, since pandas 2 + and 3 have different base time units (ns vs us). The function should be able to handle + both cases, but the test is to check if the behavior of pandas has changed + in a way that affects the function. + """ + series = pd.Series(datestr) + datetime_series = imod.util.time.to_pandas_datetime_series(series) + assert datetime_series.dtype == np.dtype("datetime64[us]") + assert datetime_series.iloc[0] == np.datetime64("2000-01-01", "us") + assert datetime_series.iloc[-1] == np.datetime64("9999-01-01", "us") diff --git a/imod/tests/test_wq/test_wq_drn.py b/imod/tests/test_wq/test_wq_drn.py index 217d54521..c2e2fa874 100644 --- a/imod/tests/test_wq/test_wq_drn.py +++ b/imod/tests/test_wq/test_wq_drn.py @@ -88,10 +88,7 @@ def test_render_with_stress_repeats__elevation(drainage): def test_compress_discontinuous_layers(drainage): drn = drainage - layer = drn["layer"].values - layer[1] += 1 - layer[2] += 2 - drn["layer"] = drn["layer"].copy(data=layer) + drn.dataset = drn.dataset.assign_coords(layer=[1, 3, 5]) directory = pathlib.Path(".") compare = """ diff --git a/imod/util/expand_repetitions.py b/imod/util/expand_repetitions.py index 869e8e0a4..981b85073 100644 --- a/imod/util/expand_repetitions.py +++ b/imod/util/expand_repetitions.py @@ -141,8 +141,9 @@ def resample_timeseries( drop=True ) # If last value is nan (fell outside range), pad with last well rate. - if np.isnan(output_frame["rate"].values[-1]): - output_frame["rate"].values[-1] = well_rate["rate"].values[-1] + last_index = output_frame.index[-1] + if output_frame.isna().loc[last_index, "rate"]: + output_frame.loc[last_index, "rate"] = well_rate["rate"].iloc[-1] if is_steady_state: # Take first element, the slice is to force pandas to return it as diff --git a/imod/util/time.py b/imod/util/time.py index 75186b517..8525fcb6c 100644 --- a/imod/util/time.py +++ b/imod/util/time.py @@ -18,9 +18,10 @@ def to_pandas_datetime_series(series: pd.Series): """ Convert series to pandas datetime, uses length of first string to find the - appropriate format. This takes nanosecond as base. This only supports going - up to the year 2261; the function sets dates beyond this year silently to - pd.NaT. + appropriate format. This takes nanosecond as base in pandas 2, which only + supports going up to the year 2261; the function sets dates beyond this year + silently to pd.NaT. Pandas 3 takes microsecond as base, which supports going + beyond the year 9999. """ len_date = len(series.iloc[0]) dt_format = DATETIME_FORMATS[len_date] diff --git a/pixi.lock b/pixi.lock index ef8160db4..861b8a952 100644 --- a/pixi.lock +++ b/pixi.lock @@ -339,7 +339,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.1.2-h17f744e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandamesh-0.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.3-py312hf79963d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.0-py312h8ecdadd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.3-h9ac818e_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda @@ -390,7 +390,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/python-gmsh-4.15.0-pyh57928b3_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.7.8-py312h5253ce2_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytokens-0.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda @@ -811,7 +810,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/orc-2.2.1-hd1b02dc_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandamesh-0.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.3.3-py312h86abcb1_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-3.0.0-py312hc7bc305_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.56.3-hae8941d_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda @@ -860,7 +859,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/python-gmsh-4.15.0-pyh57928b3_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-librt-0.7.8-py312hf7082af_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytokens-0.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda @@ -1258,7 +1256,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.2.1-h4fd0076_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandamesh-0.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.3-py312h5978115_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.0-py312hae6be28_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.3-h5fd7515_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda @@ -1307,7 +1305,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/python-gmsh-4.15.0-pyh57928b3_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-librt-0.7.8-py312hb3ab3e3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytokens-0.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda @@ -1664,7 +1661,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.2.1-h7414dfc_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandamesh-0.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.3-py312hc128f0a_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-3.0.0-py312h95189c4_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.3-h0c53d3b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda @@ -2216,7 +2213,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandamesh-0.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.3-py312hf79963d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.0-py312h8ecdadd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.3-h9ac818e_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda @@ -2766,7 +2763,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandamesh-0.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.3.3-py312h86abcb1_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-3.0.0-py312hc7bc305_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.56.3-hae8941d_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda @@ -3293,7 +3290,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandamesh-0.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.3-py312h5978115_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.0-py312hae6be28_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.3-h5fd7515_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda @@ -3778,7 +3775,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandamesh-0.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.3-py312hc128f0a_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-3.0.0-py312h95189c4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.3-h0c53d3b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.5-pyhcf101f3_0.conda @@ -4793,7 +4790,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/orjson-3.11.5-py312h94568fe_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandamesh-0.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.3-py312hf79963d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.0-py312h8ecdadd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.3-h9ac818e_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pathlib2-2.3.7.post1-py312h7900ff3_5.conda @@ -5341,7 +5338,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/orjson-3.11.5-py312hf2aa680_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandamesh-0.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.3.3-py312h86abcb1_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-3.0.0-py312hc7bc305_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.56.3-hae8941d_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pathlib2-2.3.7.post1-py312hb401068_5.conda @@ -5864,7 +5861,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orjson-3.11.5-py312h6f167cc_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandamesh-0.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.3-py312h5978115_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.0-py312hae6be28_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.3-h5fd7515_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pathlib2-2.3.7.post1-py312h81bd7bf_5.conda @@ -6346,7 +6343,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/orjson-3.11.5-py312hfb36fc7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandamesh-0.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.3-py312hc128f0a_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-3.0.0-py312h95189c4_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.3-h0c53d3b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pathlib2-2.3.7.post1-py312h2e8e312_5.conda @@ -21667,213 +21664,234 @@ packages: - pkg:pypi/pandamesh?source=hash-mapping size: 38710 timestamp: 1738918268750 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.3-py312hf79963d_1.conda - sha256: f633d5f9b28e4a8f66a6ec9c89ef1b6743b880b0511330184b4ab9b7e2dda247 - md5: e597b3e812d9613f659b7d87ad252d18 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.0-py312h8ecdadd_0.conda + sha256: 729c74e74703ab8686ee3915fd3023b6c454d0d97c60ec2e5f5c537cdab5277a + md5: 2db19c9eb81049acf8108ccfbe5cc2ed depends: + - python + - numpy >=1.26.0 + - python-dateutil >=2.8.2 - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libstdcxx >=14 - - numpy >=1.22.4 - numpy >=1.23,<3 - - python >=3.12,<3.13.0a0 - - python-dateutil >=2.8.2 - - python-tzdata >=2022.7 - python_abi 3.12.* *_cp312 - - pytz >=2020.1 constrains: - - xarray >=2022.12.0 - - qtpy >=2.3.0 + - adbc-driver-postgresql >=1.2.0 + - adbc-driver-sqlite >=1.2.0 + - beautifulsoup4 >=4.12.3 + - blosc >=1.21.3 + - bottleneck >=1.4.2 + - fastparquet >=2024.11.0 + - fsspec >=2024.10.0 + - gcsfs >=2024.10.0 - html5lib >=1.1 - - pandas-gbq >=0.19.0 - - tzdata >=2022.7 - - fsspec >=2022.11.0 - - fastparquet >=2022.12.0 + - hypothesis >=6.116.0 + - jinja2 >=3.1.5 + - lxml >=5.3.0 + - matplotlib >=3.9.3 + - numba >=0.60.0 + - numexpr >=2.10.2 - odfpy >=1.4.1 - - pyxlsb >=1.0.10 - - scipy >=1.10.0 - - sqlalchemy >=2.0.0 - - pytables >=3.8.0 - - bottleneck >=1.3.6 - - pyarrow >=10.0.1 - - numexpr >=2.8.4 + - openpyxl >=3.1.5 + - psycopg2 >=2.9.10 + - pyarrow >=13.0.0 + - pyiceberg >=0.8.1 + - pymysql >=1.1.1 - pyqt5 >=5.15.9 - - xlsxwriter >=3.0.5 - - openpyxl >=3.1.0 - - blosc >=1.21.3 - - matplotlib >=3.6.3 - - lxml >=4.9.2 - - numba >=0.56.4 - - s3fs >=2022.11.0 + - pyreadstat >=1.2.8 + - pytables >=3.10.1 + - pytest >=8.3.4 + - pytest-xdist >=3.6.1 + - python-calamine >=0.3.0 + - pytz >=2024.2 + - pyxlsb >=1.0.10 + - qtpy >=2.4.2 + - scipy >=1.14.1 + - s3fs >=2024.10.0 + - sqlalchemy >=2.0.36 - tabulate >=0.9.0 + - xarray >=2024.10.0 - xlrd >=2.0.1 - - gcsfs >=2022.11.0 - - pyreadstat >=1.2.0 - - python-calamine >=0.1.7 - - zstandard >=0.19.0 - - psycopg2 >=2.9.6 - - beautifulsoup4 >=4.11.2 + - xlsxwriter >=3.2.0 + - zstandard >=0.23.0 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/pandas?source=hash-mapping - size: 15099922 - timestamp: 1759266031115 -- conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.3.3-py312h86abcb1_2.conda - sha256: 112273ffd9572a4733c98b9d80a243f38db4d0fce5d34befaf9eb6f64ed39ba3 - md5: d7dfad2b9a142319cec4736fe88d8023 + - pkg:pypi/pandas?source=compressed-mapping + size: 14819633 + timestamp: 1769076306074 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-3.0.0-py312hc7bc305_0.conda + sha256: 1b8b71ae0ee36dc23d186be5925f8bfdc8eee6aa4bb44b86e06b76f5dd5d1f28 + md5: 5dea4dcec1af82256a2258c3917ef98a depends: + - python + - numpy >=1.26.0 + - python-dateutil >=2.8.2 - __osx >=10.13 - libcxx >=19 - - numpy >=1.22.4 - numpy >=1.23,<3 - - python >=3.12,<3.13.0a0 - - python-dateutil >=2.8.2 - - python-tzdata >=2022.7 - python_abi 3.12.* *_cp312 - - pytz >=2020.1 constrains: - - pyarrow >=10.0.1 - - tabulate >=0.9.0 + - adbc-driver-postgresql >=1.2.0 + - adbc-driver-sqlite >=1.2.0 + - beautifulsoup4 >=4.12.3 + - blosc >=1.21.3 + - bottleneck >=1.4.2 + - fastparquet >=2024.11.0 + - fsspec >=2024.10.0 + - gcsfs >=2024.10.0 - html5lib >=1.1 - - s3fs >=2022.11.0 - - pandas-gbq >=0.19.0 - - matplotlib >=3.6.3 - - qtpy >=2.3.0 - - scipy >=1.10.0 - - zstandard >=0.19.0 - - bottleneck >=1.3.6 - - numexpr >=2.8.4 - - pyxlsb >=1.0.10 - - tzdata >=2022.7 - - psycopg2 >=2.9.6 - - pytables >=3.8.0 - - fsspec >=2022.11.0 - - python-calamine >=0.1.7 - - xarray >=2022.12.0 - - numba >=0.56.4 + - hypothesis >=6.116.0 + - jinja2 >=3.1.5 + - lxml >=5.3.0 + - matplotlib >=3.9.3 + - numba >=0.60.0 + - numexpr >=2.10.2 + - odfpy >=1.4.1 + - openpyxl >=3.1.5 + - psycopg2 >=2.9.10 + - pyarrow >=13.0.0 + - pyiceberg >=0.8.1 + - pymysql >=1.1.1 - pyqt5 >=5.15.9 + - pyreadstat >=1.2.8 + - pytables >=3.10.1 + - pytest >=8.3.4 + - pytest-xdist >=3.6.1 + - python-calamine >=0.3.0 + - pytz >=2024.2 + - pyxlsb >=1.0.10 + - qtpy >=2.4.2 + - scipy >=1.14.1 + - s3fs >=2024.10.0 + - sqlalchemy >=2.0.36 + - tabulate >=0.9.0 + - xarray >=2024.10.0 - xlrd >=2.0.1 - - blosc >=1.21.3 - - odfpy >=1.4.1 - - openpyxl >=3.1.0 - - fastparquet >=2022.12.0 - - xlsxwriter >=3.0.5 - - pyreadstat >=1.2.0 - - sqlalchemy >=2.0.0 - - gcsfs >=2022.11.0 - - beautifulsoup4 >=4.11.2 - - lxml >=4.9.2 + - xlsxwriter >=3.2.0 + - zstandard >=0.23.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pandas?source=hash-mapping - size: 14008759 - timestamp: 1764615365220 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.3-py312h5978115_2.conda - sha256: 93aa5b02e2394080a32fee9fb151da3384d317a42472586850abb37b28f314db - md5: fcbba82205afa4956c39136c68929385 + size: 14115594 + timestamp: 1769076448005 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.0-py312hae6be28_0.conda + sha256: e77a102f752d66a4afbda7ba4746689ec3083723d5d6fc7d5af8ddef25ff5655 + md5: 2b38a1d070dff7f0f92641a5fa130e23 depends: + - python + - numpy >=1.26.0 + - python-dateutil >=2.8.2 - __osx >=11.0 + - python 3.12.* *_cpython - libcxx >=19 - - numpy >=1.22.4 - numpy >=1.23,<3 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python-dateutil >=2.8.2 - - python-tzdata >=2022.7 - python_abi 3.12.* *_cp312 - - pytz >=2020.1 constrains: - - xarray >=2022.12.0 - - scipy >=1.10.0 - - tabulate >=0.9.0 - - pytables >=3.8.0 - - xlsxwriter >=3.0.5 - - pyxlsb >=1.0.10 - - odfpy >=1.4.1 - - zstandard >=0.19.0 - - fastparquet >=2022.12.0 - - gcsfs >=2022.11.0 - - beautifulsoup4 >=4.11.2 - - qtpy >=2.3.0 - - xlrd >=2.0.1 - - pandas-gbq >=0.19.0 - - s3fs >=2022.11.0 - - pyreadstat >=1.2.0 - - tzdata >=2022.7 - - html5lib >=1.1 - - fsspec >=2022.11.0 - - lxml >=4.9.2 - - numexpr >=2.8.4 + - adbc-driver-postgresql >=1.2.0 + - adbc-driver-sqlite >=1.2.0 + - beautifulsoup4 >=4.12.3 - blosc >=1.21.3 - - openpyxl >=3.1.0 - - pyarrow >=10.0.1 - - python-calamine >=0.1.7 - - numba >=0.56.4 - - sqlalchemy >=2.0.0 + - bottleneck >=1.4.2 + - fastparquet >=2024.11.0 + - fsspec >=2024.10.0 + - gcsfs >=2024.10.0 + - html5lib >=1.1 + - hypothesis >=6.116.0 + - jinja2 >=3.1.5 + - lxml >=5.3.0 + - matplotlib >=3.9.3 + - numba >=0.60.0 + - numexpr >=2.10.2 + - odfpy >=1.4.1 + - openpyxl >=3.1.5 + - psycopg2 >=2.9.10 + - pyarrow >=13.0.0 + - pyiceberg >=0.8.1 + - pymysql >=1.1.1 - pyqt5 >=5.15.9 - - psycopg2 >=2.9.6 - - bottleneck >=1.3.6 - - matplotlib >=3.6.3 + - pyreadstat >=1.2.8 + - pytables >=3.10.1 + - pytest >=8.3.4 + - pytest-xdist >=3.6.1 + - python-calamine >=0.3.0 + - pytz >=2024.2 + - pyxlsb >=1.0.10 + - qtpy >=2.4.2 + - scipy >=1.14.1 + - s3fs >=2024.10.0 + - sqlalchemy >=2.0.36 + - tabulate >=0.9.0 + - xarray >=2024.10.0 + - xlrd >=2.0.1 + - xlsxwriter >=3.2.0 + - zstandard >=0.23.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pandas?source=hash-mapping - size: 13893993 - timestamp: 1764615503244 -- conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.3-py312hc128f0a_2.conda - sha256: 7f37f3ccea378f491f68979c7afd7f2dbc8ee83c3461dfab3cce15d436298f44 - md5: 57d80e87a8b3161bcf26472deceaa556 + size: 13876050 + timestamp: 1769076491884 +- conda: https://conda.anaconda.org/conda-forge/win-64/pandas-3.0.0-py312h95189c4_0.conda + sha256: cf9409d6f3b82a966d62c6d25dac02cf7277887591ff98d5f80f44815acef084 + md5: 471867d1335d19294ff2b3391c4c7122 depends: - - numpy >=1.22.4 - - numpy >=1.23,<3 - - python >=3.12,<3.13.0a0 + - python + - numpy >=1.26.0 - python-dateutil >=2.8.2 - - python-tzdata >=2022.7 - - python_abi 3.12.* *_cp312 - - pytz >=2020.1 - - ucrt >=10.0.20348.0 + - python-tzdata - vc >=14.3,<15 - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.23,<3 + - python_abi 3.12.* *_cp312 constrains: + - adbc-driver-postgresql >=1.2.0 + - adbc-driver-sqlite >=1.2.0 + - beautifulsoup4 >=4.12.3 - blosc >=1.21.3 - - qtpy >=2.3.0 - - pandas-gbq >=0.19.0 - - lxml >=4.9.2 - - fsspec >=2022.11.0 - - xarray >=2022.12.0 - - gcsfs >=2022.11.0 - - tabulate >=0.9.0 - - numba >=0.56.4 - - xlrd >=2.0.1 + - bottleneck >=1.4.2 + - fastparquet >=2024.11.0 + - fsspec >=2024.10.0 + - gcsfs >=2024.10.0 - html5lib >=1.1 - - beautifulsoup4 >=4.11.2 + - hypothesis >=6.116.0 + - jinja2 >=3.1.5 + - lxml >=5.3.0 + - matplotlib >=3.9.3 + - numba >=0.60.0 + - numexpr >=2.10.2 + - odfpy >=1.4.1 + - openpyxl >=3.1.5 + - psycopg2 >=2.9.10 + - pyarrow >=13.0.0 + - pyiceberg >=0.8.1 + - pymysql >=1.1.1 - pyqt5 >=5.15.9 - - openpyxl >=3.1.0 - - zstandard >=0.19.0 - - psycopg2 >=2.9.6 - - bottleneck >=1.3.6 - - pytables >=3.8.0 - - pyreadstat >=1.2.0 - - python-calamine >=0.1.7 - - pyarrow >=10.0.1 - - s3fs >=2022.11.0 - - matplotlib >=3.6.3 + - pyreadstat >=1.2.8 + - pytables >=3.10.1 + - pytest >=8.3.4 + - pytest-xdist >=3.6.1 + - python-calamine >=0.3.0 + - pytz >=2024.2 - pyxlsb >=1.0.10 - - tzdata >=2022.7 - - odfpy >=1.4.1 - - sqlalchemy >=2.0.0 - - scipy >=1.10.0 - - xlsxwriter >=3.0.5 - - fastparquet >=2022.12.0 - - numexpr >=2.8.4 + - qtpy >=2.4.2 + - scipy >=1.14.1 + - s3fs >=2024.10.0 + - sqlalchemy >=2.0.36 + - tabulate >=0.9.0 + - xarray >=2024.10.0 + - xlrd >=2.0.1 + - xlsxwriter >=3.2.0 + - zstandard >=0.23.0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pandas?source=hash-mapping - size: 13779090 - timestamp: 1764615170494 + size: 13593024 + timestamp: 1769076331133 - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 sha256: 2bb9ba9857f4774b85900c2562f7e711d08dd48e2add9bee4e1612fbee27e16f md5: 457c2c8c08e54905d6954e79cb5b5db9 diff --git a/pixi.toml b/pixi.toml index c9cb3acf4..6121d63b1 100644 --- a/pixi.toml +++ b/pixi.toml @@ -88,7 +88,7 @@ netcdf4 = "*" numba = ">=0.50" numpy = "*" pandamesh = "*" -pandas = "*" +pandas = ">=3" pip = "*" plum-dispatch = "*" pooch = "*"