Repository: great-expectations/great_expectations

Issue:
expect_column_values_to_be_dateutil_parseable fails with error
**Describe the bug**
Expectation `expect_column_values_to_be_dateutil_parseable` against a pandas batch (V3 API) fails with error. According to the docs, it should be both migrated to the V3 API and implemented for the specific backend.

**To Reproduce**
Steps to reproduce the behavior:
1. Create a v3 datasource, for instance
```yaml
my_data_source:
    class_name: Datasource
    execution_engine:
      class_name: PandasExecutionEngine
    data_connectors:
      raw:
        class_name: ConfiguredAssetFilesystemDataConnector
        base_directory: /tmp/raw
        assets:
          my_asset:
            base_directory: my_asset/
            pattern: (.*)/data\.csv
            group_names:
              - batch_date
```
2. Create a file  `/tmp/raw/my_asset/2021-01-01/data.csv` with some values to validate, for instance
```
id,created
1,2021-03-04
2,2021-03-05
```
3. Get a validator and attempt to run the specific expectation
```python
suite = context.create_expectation_suite("test", overwrite_existing=True)

br = BatchRequest(
    datasource_name="my_data_source",
    data_connector_name="raw",
    data_asset_name="my_asset",
    data_connector_query={
        "batch_filter_parameters": {
            "batch_date": "2021-01-01",
        }
    }
)
validator = context.get_validator(batch_request=br, expectation_suite=suite)
validator.expect_column_values_to_be_dateutil_parseable("created")
```

3. See error in the output
```
MetricProviderError                       Traceback (most recent call last)
<ipython-input-152-c4ce570d2ae2> in <module>

---> 23 validator.expect_column_values_to_be_dateutil_parseable("created")

/usr/local/Caskroom/miniconda/base/envs/test/lib/python3.8/site-packages/great_expectations/validator/validator.py in inst_expectation(*args, **kwargs)
    268 
    269                 else:
--> 270                     raise err
    271             return validation_result
    272 
/usr/local/Caskroom/miniconda/base/envs/test/lib/python3.8/site-packages/great_expectations/validator/validator.py in inst_expectation(*args, **kwargs)
    226                     )
    227                 else:
--> 228                     validation_result = expectation.validate(
    229                         validator=self,
    230                         evaluation_parameters=self._expectation_suite.evaluation_parameters,
/usr/local/Caskroom/miniconda/base/envs/test/lib/python3.8/site-packages/great_expectations/expectations/expectation.py in validate(self, validator, configuration, evaluation_parameters, interactive_evaluation, data_context, runtime_configuration)
    639             evaluation_parameters, interactive_evaluation, data_context
    640         )
--> 641         evr = validator.graph_validate(
    642             configurations=[configuration],
    643             runtime_configuration=runtime_configuration,
/usr/local/Caskroom/miniconda/base/envs/test/lib/python3.8/site-packages/great_expectations/validator/validator.py in graph_validate(self, configurations, metrics, runtime_configuration)
    428 
    429             expectation_impl = get_expectation_impl(configuration.expectation_type)
--> 430             validation_dependencies = expectation_impl().get_validation_dependencies(
    431                 configuration, self._execution_engine, runtime_configuration
    432             )["metrics"]
/usr/local/Caskroom/miniconda/base/envs/test/lib/python3.8/site-packages/great_expectations/expectations/expectation.py in get_validation_dependencies(self, configuration, execution_engine, runtime_configuration)
   1253             metric_value_kwargs=metric_kwargs["metric_value_kwargs"],
   1254         )
-> 1255         metric_kwargs = get_metric_kwargs(
   1256             metric_name=self.map_metric + ".unexpected_count",
   1257             configuration=configuration,
/usr/local/Caskroom/miniconda/base/envs/test/lib/python3.8/site-packages/great_expectations/expectations/registry.py in get_metric_kwargs(metric_name, configuration, runtime_configuration)
    202         metric_definition = _registered_metrics.get(metric_name)
    203         if metric_definition is None:
--> 204             raise MetricProviderError(f"No definition found for {metric_name}")
    205         default_kwarg_values = metric_definition["default_kwarg_values"]
    206         metric_kwargs = {
MetricProviderError: No definition found for column_values.dateutil_parsable.unexpected_count
```

**Expected behavior**
The expectation should successfully validate the data

The expectation works fine in a similar setup using the V2 API:
```python
import pandas as pd
suite = context.create_expectation_suite("test", overwrite_existing=True)
df = pd.DataFrame({"test": ["2021-03-04", "2021-03-05"], "failing_test": ["a", "b"]})

batch_kwargs = {"datasource": "my_data_source", "data_asset_name": "my_asset", "dataset": df}

batch = context.get_batch(batch_kwargs=batch_kwargs, expectation_suite_name=suite)
batch.expect_column_values_to_be_dateutil_parseable("test")
batch.expect_column_values_to_be_dateutil_parseable("failing_test")
```

**Environment (please complete the following information):**
 - Operating System: MacOS
 - Great Expectations Version: 0.13.19



Discussion:

Resolving patch:
diff --git a/great_expectations/expectations/core/expect_column_values_to_be_dateutil_parseable.py b/great_expectations/expectations/core/expect_column_values_to_be_dateutil_parseable.py
--- a/great_expectations/expectations/core/expect_column_values_to_be_dateutil_parseable.py
+++ b/great_expectations/expectations/core/expect_column_values_to_be_dateutil_parseable.py
@@ -74,7 +74,7 @@ class ExpectColumnValuesToBeDateutilParseable(ColumnMapExpectation):
         "requirements": [],
     }
 
-    map_metric = "column_values.dateutil_parsable"
+    map_metric = "column_values.dateutil_parseable"
     success_keys = ("mostly",)
 
     default_kwarg_values = {


Test patch:
diff --git a/tests/test_definitions/column_map_expectations/expect_column_values_to_be_dateutil_parseable.json b/tests/test_definitions/column_map_expectations/expect_column_values_to_be_dateutil_parseable.json
new file mode 100644
--- /dev/null
+++ b/tests/test_definitions/column_map_expectations/expect_column_values_to_be_dateutil_parseable.json
@@ -0,0 +1,56 @@
+{
+    "expectation_type" : "expect_column_values_to_be_dateutil_parseable",
+    "datasets" : [{
+      "data" : {
+        "a": ["2019-04-01", "2019-04-02", "2019-04-03", "2019-04-13"],
+        "b": ["01/01/2010", "01/01/2011", "01/01/2012", "abc"],
+        "c": ["cat", "dog", "horse",  "01/01/2011"],
+        "d": [1, 2, 3, 4]
+      },
+      "tests": [{
+        "title": "positive_test",
+        "exact_match_out" : false,
+        "in":{
+          "column": "a"
+        },
+        "out":{
+          "success": true,
+          "unexpected_list": []
+        }
+      },
+      {
+        "title": "positive_test_with_nulls",
+        "exact_match_out" : false,
+        "in":{
+          "column": "b",
+          "mostly": 0.75
+        },
+        "out":{
+          "success": true
+        }
+      },
+      {
+        "title": "negative_test",
+        "exact_match_out" : false,
+        "in":{
+          "column": "c",
+          "mostly": 0.75
+        },
+        "out":{
+          "success": false
+        }
+      },
+      {
+        "title": "test_raising_exception_for_wrong_input_data_type",
+        "exact_match_out" : false,
+        "in":{
+          "column": "d",
+          "catch_exceptions": true
+        },
+        "out":{
+          "traceback_substring": "Values passed to expect_column_values_to_be_dateutil_parseable must be of type string."
+        }
+      }
+      ]
+    }]
+}