{"record":{"id":"1dbd15a7486ee6f8","repo":"pandas-dev/pandas","slug":"invalid-dtype-dtype-for-periodarray","errorCode":null,"errorMessage":"Invalid dtype {dtype} for PeriodArray","messagePattern":"Invalid dtype (.+?) for PeriodArray","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"pandas/core/arrays/period.py","lineNumber":229,"sourceCode":"        \"days_in_month\",\n    ]\n    # GH#46768 - deprecated but still need to be accessible via .dt accessor\n    _deprecated_ops: list[str] = [\"dayofweek\", \"dayofyear\", \"daysinmonth\"]\n    _datetimelike_ops: list[str] = (\n        _field_ops + _object_ops + _bool_ops + _deprecated_ops\n    )\n    _datetimelike_methods: list[str] = [\"strftime\", \"to_timestamp\", \"asfreq\"]\n\n    _dtype: PeriodDtype\n\n    # --------------------------------------------------------------------\n    # Constructors\n\n    def __init__(self, values, dtype: Dtype | None = None, copy: bool = False) -> None:\n        if dtype is not None:\n            dtype = pandas_dtype(dtype)\n            if not isinstance(dtype, PeriodDtype):\n                raise ValueError(f\"Invalid dtype {dtype} for PeriodArray\")\n\n        if isinstance(values, ABCSeries):\n            values = values._values\n            if not isinstance(values, type(self)):\n                raise TypeError(\"Incorrect dtype\")\n\n        elif isinstance(values, ABCPeriodIndex):\n            values = values._values\n\n        if isinstance(values, type(self)):\n            if dtype is not None and dtype != values.dtype:\n                raise raise_on_incompatible(values, dtype.freq)\n            values, dtype = values._ndarray, values.dtype\n\n        if not copy:\n            values = np.asarray(values, dtype=\"int64\")\n        else:\n            values = np.array(values, dtype=\"int64\", copy=copy)","sourceCodeStart":211,"sourceCodeEnd":247,"githubUrl":"https://github.com/pandas-dev/pandas/blob/71959b8cb9b2459c16e14b34f28b178ccfe14735/pandas/core/arrays/period.py#L211-L247","documentation":"Raised by PeriodArray.__init__ when a dtype argument is supplied but is not a PeriodDtype. PeriodArray only ever carries period[freq] data, so any non-PeriodDtype (int64, datetime64, object, str) passed as dtype is rejected at construction.","triggerScenarios":"Constructing PeriodArray(values, dtype='int64'), PeriodArray(values, dtype='datetime64[ns]'), or passing a Series/Index whose dtype is not period. Internal calls from period_array()/PeriodIndex that propagate a foreign dtype.","commonSituations":"Confusing PeriodArray with DatetimeArray/TimedeltaArray. Passing dtype='D' (a freq string) instead of PeriodDtype('D'). Building arrays from mixed metadata where dtype was inferred as object.","solutions":["Pass a PeriodDtype: dtype=pd.PeriodDtype('D') or dtype='period[D]'.","If you only have a freq, let PeriodArray infer from values or pass via period_array(data, dtype=pd.PeriodDtype(freq)).","Use the correct array class for the data type (DatetimeArray for timestamps)."],"exampleFix":"# before\npd.arrays.PeriodArray([1, 2, 3], dtype='int64')\n# after\npd.arrays.PeriodArray(pd.PeriodIndex(['2020-01-01','2020-01-02'], freq='D'))\n# or with explicit period dtype\npd.period_array(['2020-01-01','2020-01-02'], dtype=pd.PeriodDtype('D'))","handlingStrategy":"type-guard","validationCode":"import pandas as pd\nfrom pandas.core.dtypes.dtypes import PeriodDtype\n\ndef to_period_array(values, dtype=None):\n    if dtype is not None and not isinstance(dtype, PeriodDtype):\n        dtype = pd.PeriodDtype(dtype) if isinstance(dtype, str) and dtype.startswith('period') else None\n    return pd.period_array(values, dtype=dtype)","typeGuard":"from pandas.core.dtypes.dtypes import PeriodDtype\n\ndef is_period_dtype(dtype) -> bool:\n    return isinstance(dtype, PeriodDtype)","tryCatchPattern":"try:\n    pa = pd.arrays.PeriodArray(values, dtype=dtype)\nexcept ValueError:\n    pa = pd.period_array(values, dtype=pd.PeriodDtype('D'))","preventionTips":["Construct PeriodArray via pd.period_array(...) or PeriodIndex, not the raw class.","Always pass dtype as PeriodDtype or a 'period[freq]' string.","Validate dtype isinstance PeriodDtype at API boundaries."],"tags":["period","dtype","constructor","pandas-arrays"],"analyzedSha":"71959b8cb9b2459c16e14b34f28b178ccfe14735","analyzedAt":"2026-08-07T01:30:20.476Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}