coveralls: 
[![Coverage Status](https://coveralls.io/builds/25186762/badge)](https://coveralls.io/builds/25186762)

Coverage decreased (-0.2%) to 87.888% when pulling **2094b11860e490ba0101e3cb0bddaec74949617a on danielhuppmann:fix/filter_keep** into **d5a3a9f46a087e92d28754ba91d9ae48c5db638a on IAMconsortium:master**.

coveralls: 
[![Coverage Status](https://coveralls.io/builds/25186762/badge)](https://coveralls.io/builds/25186762)

Coverage decreased (-0.2%) to 87.888% when pulling **2094b11860e490ba0101e3cb0bddaec74949617a on danielhuppmann:fix/filter_keep** into **d5a3a9f46a087e92d28754ba91d9ae48c5db638a on IAMconsortium:master**.

gidden: Looks good @danielhuppmann. One request: can you add an explicit test for a non-bool'd `keep`? I think the last test is actually doing this, but it would be nice to have something explicit (e.g., `keep='foo'`).
gidden: ok, lgtm! will merge when CI passes.
danielhuppmann: thanks @gidden for the review!
diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md
index 3cf842e..bbd0b84 100644
--- a/RELEASE_NOTES.md
+++ b/RELEASE_NOTES.md
@@ -1,6 +1,7 @@
 
 # Next Release
 
+- [#261](https://github.com/IAMconsortium/pyam/pull/261) Add a check that `keep` in `filter()` is a boolean
 - [#243](https://github.com/IAMconsortium/pyam/pull/243) Update `pyam.iiasa.Connection` to support all public and private database connections. DEPRECATED: the argument 'iamc15' has been deprecated in favor of names as queryable directly from the REST API.
 - [#241](https://github.com/IAMconsortium/pyam/pull/241) Add `set_meta_from_data` feature
 - [#236](https://github.com/IAMconsortium/pyam/pull/236) Add `swap_time_for_year` method and confirm datetime column is compatible with pyam features
diff --git a/pyam/core.py b/pyam/core.py
index e945530..c563188 100644
--- a/pyam/core.py
+++ b/pyam/core.py
@@ -974,6 +974,10 @@ class IamDataFrame(object):
                ('month', 'hour', 'time')
              - 'regexp=True' disables pseudo-regexp syntax in `pattern_match()`
         """
+        if not isinstance(keep, bool):
+            msg = '`filter(keep={}, ...)` is not valid, must be boolean'
+            raise ValueError(msg.format(keep))
+
         _keep = self._apply_filters(**kwargs)
         _keep = _keep if keep else ~_keep
         ret = copy.deepcopy(self) if not inplace else self

`filter()` assumes non-starred `dict` as `keep` kwarg
# Observed (user) error

Just ran into a stupid error where I used `df.filter(dict(foo='bar')` instead of `df.filter(**dict(foo='bar')`, so rather than applying the expected `foo='bar'` rule, the function interprets the dict as the `keep` kwarg.

# Suggested solution

Add a check that `keep` is a boolean, raise error otherwise.
diff --git a/tests/test_core.py b/tests/test_core.py
index 3bc0596..e4df621 100644
--- a/tests/test_core.py
+++ b/tests/test_core.py
@@ -201,8 +201,15 @@ def test_variable_depth_raises(test_df):
     pytest.raises(ValueError, test_df.filter, level='1/')
 
 
-def test_filter_error(test_df):
-    pytest.raises(ValueError, test_df.filter, foo='foo')
+def test_filter_error_illegal_column(test_df):
+    # filtering by column `foo` is not valid
+    pytest.raises(ValueError, test_df.filter, foo='test')
+
+
+def test_filter_error_keep(test_df):
+    # string or non-starred dict was mis-interpreted as `keep` kwarg, see #253
+    pytest.raises(ValueError, test_df.filter, model='foo', keep=1)
+    pytest.raises(ValueError, test_df.filter, dict(model='foo'))
 
 
 def test_filter_year(test_df):

pip install -e .[dev]
parse_log_pytest
pytest
pytest pytest-cov pytest-mpl
3.7
ci/environment-conda-default.txt ci/environment-conda-forge.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///croot/attrs_1668696182826/work
certifi @ file:///croot/certifi_1671487769961/work/certifi
charset-normalizer==3.4.1
coverage==7.2.7
cycler==0.11.0
flit_core @ file:///opt/conda/conda-bld/flit-core_1644941570762/work/source/flit_core
fonttools==4.38.0
idna==3.10
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1648562407465/work
importlib-resources==5.12.0
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
Jinja2==3.1.6
kiwisolver==1.4.5
MarkupSafe==2.1.5
matplotlib==3.5.3
numpy==1.21.6
packaging @ file:///croot/packaging_1671697413597/work
pandas==1.3.5
Pillow==9.5.0
pluggy @ file:///tmp/build/80754af9/pluggy_1648042572264/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
-e git+https://github.com/IAMconsortium/pyam.git@d5a3a9f46a087e92d28754ba91d9ae48c5db638a#egg=pyam_iamc
pyparsing==3.1.4
pytest==7.1.2
pytest-cov==4.1.0
pytest-mpl==0.17.0
python-dateutil==2.9.0.post0
pytz==2025.2
PyYAML==6.0.1
requests==2.31.0
seaborn==0.12.2
six==1.17.0
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
typing_extensions @ file:///croot/typing_extensions_1669924550328/work
urllib3==2.0.7
xlrd==2.0.1
XlsxWriter==3.2.2
zipp @ file:///croot/zipp_1672387121353/work

name: pyam
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=22.1.0=py37h06a4308_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - flit-core=3.6.0=pyhd3eb1b0_0
  - importlib-metadata=4.11.3=py37h06a4308_0
  - importlib_metadata=4.11.3=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=22.0=py37h06a4308_0
  - pip=22.3.1=py37h06a4308_0
  - pluggy=1.0.0=py37h06a4308_1
  - py=1.11.0=pyhd3eb1b0_0
  - pytest=7.1.2=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py37h06a4308_0
  - typing_extensions=4.4.0=py37h06a4308_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.11.0=py37h06a4308_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - argparse==1.4.0
      - charset-normalizer==3.4.1
      - coverage==7.2.7
      - cycler==0.11.0
      - fonttools==4.38.0
      - idna==3.10
      - importlib-resources==5.12.0
      - jinja2==3.1.6
      - kiwisolver==1.4.5
      - markupsafe==2.1.5
      - matplotlib==3.5.3
      - numpy==1.21.6
      - pandas==1.3.5
      - pillow==9.5.0
      - pyparsing==3.1.4
      - pytest-cov==4.1.0
      - pytest-mpl==0.17.0
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - pyyaml==6.0.1
      - requests==2.31.0
      - seaborn==0.12.2
      - six==1.17.0
      - urllib3==2.0.7
      - xlrd==2.0.1
      - xlsxwriter==3.2.2
prefix: /opt/conda/envs/pyam

tests/test_core.py::test_filter_error_keep[test_df0] tests/test_core.py::test_filter_error_keep[test_df1] tests/test_core.py::test_filter_error_keep[test_df2] tests/test_core.py::test_filter_error_keep[test_df3]
tests/test_core.py::test_filter_meta_index[meta_df0] tests/test_core.py::test_filter_meta_index[meta_df1] tests/test_core.py::test_load_metadata[meta_df0] tests/test_core.py::test_load_metadata[meta_df1] tests/test_core.py::test_load_SSP_database_downloaded_file tests/test_core.py::test_load_RCP_database_downloaded_file
tests/test_core.py::test_init_df_with_index tests/test_core.py::test_init_df_with_float_cols_raises tests/test_core.py::test_init_df_with_duplicates_raises[test_df0] tests/test_core.py::test_init_df_with_duplicates_raises[test_df1] tests/test_core.py::test_init_df_with_duplicates_raises[test_df2] tests/test_core.py::test_init_df_with_duplicates_raises[test_df3] tests/test_core.py::test_init_df_with_float_cols tests/test_core.py::test_init_df_from_timeseries[test_df0] tests/test_core.py::test_init_df_from_timeseries[test_df1] tests/test_core.py::test_init_df_from_timeseries[test_df2] tests/test_core.py::test_init_df_from_timeseries[test_df3] tests/test_core.py::test_init_df_with_extra_col tests/test_core.py::test_init_datetime tests/test_core.py::test_init_datetime_subclass_long_timespan tests/test_core.py::test_to_excel[test_df0] tests/test_core.py::test_to_excel[test_df1] tests/test_core.py::test_to_excel[test_df2] tests/test_core.py::test_to_excel[test_df3] tests/test_core.py::test_to_csv[test_df0] tests/test_core.py::test_to_csv[test_df1] tests/test_core.py::test_to_csv[test_df2] tests/test_core.py::test_to_csv[test_df3] tests/test_core.py::test_get_item[test_df0] tests/test_core.py::test_get_item[test_df1] tests/test_core.py::test_get_item[test_df2] tests/test_core.py::test_get_item[test_df3] tests/test_core.py::test_model[test_df0] tests/test_core.py::test_model[test_df1] tests/test_core.py::test_model[test_df2] tests/test_core.py::test_model[test_df3] tests/test_core.py::test_scenario[test_df0] tests/test_core.py::test_scenario[test_df1] tests/test_core.py::test_scenario[test_df2] tests/test_core.py::test_scenario[test_df3] tests/test_core.py::test_region[test_df0] tests/test_core.py::test_region[test_df1] tests/test_core.py::test_region[test_df2] tests/test_core.py::test_region[test_df3] tests/test_core.py::test_variable[test_df0] tests/test_core.py::test_variable[test_df1] tests/test_core.py::test_variable[test_df2] tests/test_core.py::test_variable[test_df3] tests/test_core.py::test_variable_unit[test_df0] tests/test_core.py::test_variable_unit[test_df1] tests/test_core.py::test_variable_unit[test_df2] tests/test_core.py::test_variable_unit[test_df3] tests/test_core.py::test_filter_variable_and_depth[test_df0] tests/test_core.py::test_filter_variable_and_depth[test_df1] tests/test_core.py::test_filter_variable_and_depth[test_df2] tests/test_core.py::test_filter_variable_and_depth[test_df3] tests/test_core.py::test_variable_depth_0_keep_false[test_df0] tests/test_core.py::test_variable_depth_0_keep_false[test_df1] tests/test_core.py::test_variable_depth_0_keep_false[test_df2] tests/test_core.py::test_variable_depth_0_keep_false[test_df3] tests/test_core.py::test_variable_depth_raises[test_df0] tests/test_core.py::test_variable_depth_raises[test_df1] tests/test_core.py::test_variable_depth_raises[test_df2] tests/test_core.py::test_variable_depth_raises[test_df3] tests/test_core.py::test_filter_error_illegal_column[test_df0] tests/test_core.py::test_filter_error_illegal_column[test_df1] tests/test_core.py::test_filter_error_illegal_column[test_df2] tests/test_core.py::test_filter_error_illegal_column[test_df3] tests/test_core.py::test_filter_year[test_df0] tests/test_core.py::test_filter_year[test_df1] tests/test_core.py::test_filter_year[test_df2] tests/test_core.py::test_filter_year[test_df3] tests/test_core.py::test_filter_month[test_df0-6] tests/test_core.py::test_filter_month[test_df0-June] tests/test_core.py::test_filter_month[test_df0-Jun] tests/test_core.py::test_filter_month[test_df0-jun] tests/test_core.py::test_filter_month[test_df0-test_month4] tests/test_core.py::test_filter_month[test_df1-6] tests/test_core.py::test_filter_month[test_df1-June] tests/test_core.py::test_filter_month[test_df1-Jun] tests/test_core.py::test_filter_month[test_df1-jun] tests/test_core.py::test_filter_month[test_df1-test_month4] tests/test_core.py::test_filter_month[test_df2-6] tests/test_core.py::test_filter_month[test_df2-June] tests/test_core.py::test_filter_month[test_df2-Jun] tests/test_core.py::test_filter_month[test_df2-jun] tests/test_core.py::test_filter_month[test_df2-test_month4] tests/test_core.py::test_filter_month[test_df3-6] tests/test_core.py::test_filter_month[test_df3-June] tests/test_core.py::test_filter_month[test_df3-Jun] tests/test_core.py::test_filter_month[test_df3-jun] tests/test_core.py::test_filter_month[test_df3-test_month4] tests/test_core.py::test_filter_year_month[test_df0-6] tests/test_core.py::test_filter_year_month[test_df0-Jun] tests/test_core.py::test_filter_year_month[test_df0-jun] tests/test_core.py::test_filter_year_month[test_df0-test_month3] tests/test_core.py::test_filter_year_month[test_df1-6] tests/test_core.py::test_filter_year_month[test_df1-Jun] tests/test_core.py::test_filter_year_month[test_df1-jun] tests/test_core.py::test_filter_year_month[test_df1-test_month3] tests/test_core.py::test_filter_year_month[test_df2-6] tests/test_core.py::test_filter_year_month[test_df2-Jun] tests/test_core.py::test_filter_year_month[test_df2-jun] tests/test_core.py::test_filter_year_month[test_df2-test_month3] tests/test_core.py::test_filter_year_month[test_df3-6] tests/test_core.py::test_filter_year_month[test_df3-Jun] tests/test_core.py::test_filter_year_month[test_df3-jun] tests/test_core.py::test_filter_year_month[test_df3-test_month3] tests/test_core.py::test_filter_day[test_df0-17] tests/test_core.py::test_filter_day[test_df0-Fri] tests/test_core.py::test_filter_day[test_df0-Friday] tests/test_core.py::test_filter_day[test_df0-friday] tests/test_core.py::test_filter_day[test_df0-test_day4] tests/test_core.py::test_filter_day[test_df1-17] tests/test_core.py::test_filter_day[test_df1-Fri] tests/test_core.py::test_filter_day[test_df1-Friday] tests/test_core.py::test_filter_day[test_df1-friday] tests/test_core.py::test_filter_day[test_df1-test_day4] tests/test_core.py::test_filter_day[test_df2-17] tests/test_core.py::test_filter_day[test_df2-Fri] tests/test_core.py::test_filter_day[test_df2-Friday] tests/test_core.py::test_filter_day[test_df2-friday] tests/test_core.py::test_filter_day[test_df2-test_day4] tests/test_core.py::test_filter_day[test_df3-17] tests/test_core.py::test_filter_day[test_df3-Fri] tests/test_core.py::test_filter_day[test_df3-Friday] tests/test_core.py::test_filter_day[test_df3-friday] tests/test_core.py::test_filter_day[test_df3-test_day4] tests/test_core.py::test_filter_hour[test_df0-0] tests/test_core.py::test_filter_hour[test_df0-12] tests/test_core.py::test_filter_hour[test_df0-test_hour2] tests/test_core.py::test_filter_hour[test_df1-0] tests/test_core.py::test_filter_hour[test_df1-12] tests/test_core.py::test_filter_hour[test_df1-test_hour2] tests/test_core.py::test_filter_hour[test_df2-0] tests/test_core.py::test_filter_hour[test_df2-12] tests/test_core.py::test_filter_hour[test_df2-test_hour2] tests/test_core.py::test_filter_hour[test_df3-0] tests/test_core.py::test_filter_hour[test_df3-12] tests/test_core.py::test_filter_hour[test_df3-test_hour2] tests/test_core.py::test_filter_time_exact_match[test_df0] tests/test_core.py::test_filter_time_exact_match[test_df1] tests/test_core.py::test_filter_time_exact_match[test_df2] tests/test_core.py::test_filter_time_exact_match[test_df3] tests/test_core.py::test_filter_time_range[test_df0] tests/test_core.py::test_filter_time_range[test_df1] tests/test_core.py::test_filter_time_range[test_df2] tests/test_core.py::test_filter_time_range[test_df3] tests/test_core.py::test_filter_time_range_year[test_df0] tests/test_core.py::test_filter_time_range_year[test_df1] tests/test_core.py::test_filter_time_range_year[test_df2] tests/test_core.py::test_filter_time_range_year[test_df3] tests/test_core.py::test_filter_time_range_month[test_df0-month_range0] tests/test_core.py::test_filter_time_range_month[test_df0-Mar-Jun] tests/test_core.py::test_filter_time_range_month[test_df1-month_range0] tests/test_core.py::test_filter_time_range_month[test_df1-Mar-Jun] tests/test_core.py::test_filter_time_range_month[test_df2-month_range0] tests/test_core.py::test_filter_time_range_month[test_df2-Mar-Jun] tests/test_core.py::test_filter_time_range_month[test_df3-month_range0] tests/test_core.py::test_filter_time_range_month[test_df3-Mar-Jun] tests/test_core.py::test_filter_time_range_round_the_clock_error[test_df0-month_range0] tests/test_core.py::test_filter_time_range_round_the_clock_error[test_df1-month_range0] tests/test_core.py::test_filter_time_range_round_the_clock_error[test_df2-month_range0] tests/test_core.py::test_filter_time_range_round_the_clock_error[test_df3-month_range0] tests/test_core.py::test_filter_time_range_day[test_df0-day_range0] tests/test_core.py::test_filter_time_range_day[test_df0-Thu-Sat] tests/test_core.py::test_filter_time_range_day[test_df1-day_range0] tests/test_core.py::test_filter_time_range_day[test_df1-Thu-Sat] tests/test_core.py::test_filter_time_range_day[test_df2-day_range0] tests/test_core.py::test_filter_time_range_day[test_df2-Thu-Sat] tests/test_core.py::test_filter_time_range_day[test_df3-day_range0] tests/test_core.py::test_filter_time_range_day[test_df3-Thu-Sat] tests/test_core.py::test_filter_time_range_hour[test_df0-hour_range0] tests/test_core.py::test_filter_time_range_hour[test_df1-hour_range0] tests/test_core.py::test_filter_time_range_hour[test_df2-hour_range0] tests/test_core.py::test_filter_time_range_hour[test_df3-hour_range0] tests/test_core.py::test_filter_time_no_match[test_df0] tests/test_core.py::test_filter_time_no_match[test_df1] tests/test_core.py::test_filter_time_no_match[test_df2] tests/test_core.py::test_filter_time_no_match[test_df3] tests/test_core.py::test_filter_time_not_datetime_error[test_df0] tests/test_core.py::test_filter_time_not_datetime_error[test_df1] tests/test_core.py::test_filter_time_not_datetime_error[test_df2] tests/test_core.py::test_filter_time_not_datetime_error[test_df3] tests/test_core.py::test_filter_time_not_datetime_range_error[test_df0] tests/test_core.py::test_filter_time_not_datetime_range_error[test_df1] tests/test_core.py::test_filter_time_not_datetime_range_error[test_df2] tests/test_core.py::test_filter_time_not_datetime_range_error[test_df3] tests/test_core.py::test_filter_year_with_time_col tests/test_core.py::test_filter_as_kwarg[meta_df0] tests/test_core.py::test_filter_as_kwarg[meta_df1] tests/test_core.py::test_filter_keep_false[meta_df0] tests/test_core.py::test_filter_keep_false[meta_df1] tests/test_core.py::test_filter_by_regexp[meta_df0] tests/test_core.py::test_filter_by_regexp[meta_df1] tests/test_core.py::test_timeseries[test_df0] tests/test_core.py::test_timeseries[test_df1] tests/test_core.py::test_timeseries[test_df2] tests/test_core.py::test_timeseries[test_df3] tests/test_core.py::test_read_pandas tests/test_core.py::test_meta_idx[meta_df0] tests/test_core.py::test_meta_idx[meta_df1] tests/test_core.py::test_require_variable[meta_df0] tests/test_core.py::test_require_variable[meta_df1] tests/test_core.py::test_require_variable_top_level[meta_df0] tests/test_core.py::test_require_variable_top_level[meta_df1] tests/test_core.py::test_validate_all_pass[meta_df0] tests/test_core.py::test_validate_all_pass[meta_df1] tests/test_core.py::test_validate_nonexisting[meta_df0] tests/test_core.py::test_validate_nonexisting[meta_df1] tests/test_core.py::test_validate_up[meta_df0] tests/test_core.py::test_validate_up[meta_df1] tests/test_core.py::test_validate_lo[meta_df0] tests/test_core.py::test_validate_lo[meta_df1] tests/test_core.py::test_validate_both[meta_df0] tests/test_core.py::test_validate_both[meta_df1] tests/test_core.py::test_validate_year[meta_df0] tests/test_core.py::test_validate_year[meta_df1] tests/test_core.py::test_validate_exclude[meta_df0] tests/test_core.py::test_validate_exclude[meta_df1] tests/test_core.py::test_validate_top_level[meta_df0] tests/test_core.py::test_validate_top_level[meta_df1] tests/test_core.py::test_category_none[meta_df0] tests/test_core.py::test_category_none[meta_df1] tests/test_core.py::test_category_pass[meta_df0] tests/test_core.py::test_category_pass[meta_df1] tests/test_core.py::test_category_top_level[meta_df0] tests/test_core.py::test_category_top_level[meta_df1] tests/test_core.py::test_interpolate tests/test_core.py::test_filter_by_bool[meta_df0] tests/test_core.py::test_filter_by_bool[meta_df1] tests/test_core.py::test_filter_by_int[meta_df0] tests/test_core.py::test_filter_by_int[meta_df1] tests/test_core.py::test_map_regions_r5 tests/test_core.py::test_map_regions_r5_region_col tests/test_core.py::test_map_regions_r5_inplace tests/test_core.py::test_map_regions_r5_agg tests/test_core.py::test_48a tests/test_core.py::test_48b tests/test_core.py::test_48c tests/test_core.py::test_pd_filter_by_meta[meta_df0] tests/test_core.py::test_pd_filter_by_meta[meta_df1] tests/test_core.py::test_pd_filter_by_meta_no_index[meta_df0] tests/test_core.py::test_pd_filter_by_meta_no_index[meta_df1] tests/test_core.py::test_pd_filter_by_meta_nonmatching_index[meta_df0] tests/test_core.py::test_pd_filter_by_meta_nonmatching_index[meta_df1] tests/test_core.py::test_pd_join_by_meta_nonmatching_index[meta_df0] tests/test_core.py::test_pd_join_by_meta_nonmatching_index[meta_df1] tests/test_core.py::test_concat_fails_iter tests/test_core.py::test_concat_fails_notdf tests/test_core.py::test_concat[meta_df0] tests/test_core.py::test_concat[meta_df1] tests/test_core.py::test_normalize[meta_df0] tests/test_core.py::test_normalize[meta_df1] tests/test_core.py::test_normalize_not_time[meta_df0] tests/test_core.py::test_normalize_not_time[meta_df1] tests/test_core.py::test_swap_time_to_year[test_df0-True] tests/test_core.py::test_swap_time_to_year[test_df0-False] tests/test_core.py::test_swap_time_to_year[test_df1-True] tests/test_core.py::test_swap_time_to_year[test_df1-False] tests/test_core.py::test_swap_time_to_year[test_df2-True] tests/test_core.py::test_swap_time_to_year[test_df2-False] tests/test_core.py::test_swap_time_to_year[test_df3-True] tests/test_core.py::test_swap_time_to_year[test_df3-False] tests/test_core.py::test_swap_time_to_year_errors[test_df0-True] tests/test_core.py::test_swap_time_to_year_errors[test_df0-False] tests/test_core.py::test_swap_time_to_year_errors[test_df1-True] tests/test_core.py::test_swap_time_to_year_errors[test_df1-False] tests/test_core.py::test_swap_time_to_year_errors[test_df2-True] tests/test_core.py::test_swap_time_to_year_errors[test_df2-False] tests/test_core.py::test_swap_time_to_year_errors[test_df3-True] tests/test_core.py::test_swap_time_to_year_errors[test_df3-False]
pyam/core.py RELEASE_NOTES.md
pyam/core.py RELEASE_NOTES.md