|
6 | 6 | import numpy as np |
7 | 7 |
|
8 | 8 | from pandas._libs import NaT, iNaT, lib |
9 | | -from pandas._libs.tslibs import timezones |
10 | 9 | from pandas._libs.tslibs.period import ( |
11 | 10 | DIFFERENT_FREQ_INDEX, IncompatibleFrequency, Period) |
12 | 11 | from pandas._libs.tslibs.timedeltas import Timedelta, delta_to_nanoseconds |
|
21 | 20 | is_bool_dtype, is_datetime64_any_dtype, is_datetime64_dtype, |
22 | 21 | is_datetime64tz_dtype, is_extension_array_dtype, is_float_dtype, |
23 | 22 | is_integer_dtype, is_list_like, is_object_dtype, is_offsetlike, |
24 | | - is_period_dtype, is_timedelta64_dtype, needs_i8_conversion, pandas_dtype) |
25 | | -from pandas.core.dtypes.dtypes import DatetimeTZDtype |
| 23 | + is_period_dtype, is_timedelta64_dtype, needs_i8_conversion) |
26 | 24 | from pandas.core.dtypes.generic import ABCDataFrame, ABCIndexClass, ABCSeries |
27 | 25 | from pandas.core.dtypes.missing import isna |
28 | 26 |
|
@@ -1113,6 +1111,41 @@ def validate_endpoints(closed): |
1113 | 1111 | return left_closed, right_closed |
1114 | 1112 |
|
1115 | 1113 |
|
| 1114 | +def validate_inferred_freq(freq, inferred_freq, freq_infer): |
| 1115 | + """ |
| 1116 | + If the user passes a freq and another freq is inferred from passed data, |
| 1117 | + require that they match. |
| 1118 | +
|
| 1119 | + Parameters |
| 1120 | + ---------- |
| 1121 | + freq : DateOffset or None |
| 1122 | + inferred_freq : DateOffset or None |
| 1123 | + freq_infer : bool |
| 1124 | +
|
| 1125 | + Returns |
| 1126 | + ------- |
| 1127 | + freq : DateOffset or None |
| 1128 | + freq_infer : bool |
| 1129 | +
|
| 1130 | + Notes |
| 1131 | + ----- |
| 1132 | + We assume at this point that `maybe_infer_freq` has been called, so |
| 1133 | + `freq` is either a DateOffset object or None. |
| 1134 | + """ |
| 1135 | + if inferred_freq is not None: |
| 1136 | + if freq is not None and freq != inferred_freq: |
| 1137 | + raise ValueError('Inferred frequency {inferred} from passed ' |
| 1138 | + 'values does not conform to passed frequency ' |
| 1139 | + '{passed}' |
| 1140 | + .format(inferred=inferred_freq, |
| 1141 | + passed=freq.freqstr)) |
| 1142 | + elif freq is None: |
| 1143 | + freq = inferred_freq |
| 1144 | + freq_infer = False |
| 1145 | + |
| 1146 | + return freq, freq_infer |
| 1147 | + |
| 1148 | + |
1116 | 1149 | def maybe_infer_freq(freq): |
1117 | 1150 | """ |
1118 | 1151 | Comparing a DateOffset to the string "infer" raises, so we need to |
@@ -1140,78 +1173,6 @@ def maybe_infer_freq(freq): |
1140 | 1173 | return freq, freq_infer |
1141 | 1174 |
|
1142 | 1175 |
|
1143 | | -def validate_tz_from_dtype(dtype, tz): |
1144 | | - """ |
1145 | | - If the given dtype is a DatetimeTZDtype, extract the implied |
1146 | | - tzinfo object from it and check that it does not conflict with the given |
1147 | | - tz. |
1148 | | -
|
1149 | | - Parameters |
1150 | | - ---------- |
1151 | | - dtype : dtype, str |
1152 | | - tz : None, tzinfo |
1153 | | -
|
1154 | | - Returns |
1155 | | - ------- |
1156 | | - tz : consensus tzinfo |
1157 | | -
|
1158 | | - Raises |
1159 | | - ------ |
1160 | | - ValueError : on tzinfo mismatch |
1161 | | - """ |
1162 | | - if dtype is not None: |
1163 | | - if isinstance(dtype, compat.string_types): |
1164 | | - try: |
1165 | | - dtype = DatetimeTZDtype.construct_from_string(dtype) |
1166 | | - except TypeError: |
1167 | | - # Things like `datetime64[ns]`, which is OK for the |
1168 | | - # constructors, but also nonsense, which should be validated |
1169 | | - # but not by us. We *do* allow non-existent tz errors to |
1170 | | - # go through |
1171 | | - pass |
1172 | | - dtz = getattr(dtype, 'tz', None) |
1173 | | - if dtz is not None: |
1174 | | - if tz is not None and not timezones.tz_compare(tz, dtz): |
1175 | | - raise ValueError("cannot supply both a tz and a dtype" |
1176 | | - " with a tz") |
1177 | | - tz = dtz |
1178 | | - return tz |
1179 | | - |
1180 | | - |
1181 | | -def validate_dtype_freq(dtype, freq): |
1182 | | - """ |
1183 | | - If both a dtype and a freq are available, ensure they match. If only |
1184 | | - dtype is available, extract the implied freq. |
1185 | | -
|
1186 | | - Parameters |
1187 | | - ---------- |
1188 | | - dtype : dtype |
1189 | | - freq : DateOffset or None |
1190 | | -
|
1191 | | - Returns |
1192 | | - ------- |
1193 | | - freq : DateOffset |
1194 | | -
|
1195 | | - Raises |
1196 | | - ------ |
1197 | | - ValueError : non-period dtype |
1198 | | - IncompatibleFrequency : mismatch between dtype and freq |
1199 | | - """ |
1200 | | - if freq is not None: |
1201 | | - freq = frequencies.to_offset(freq) |
1202 | | - |
1203 | | - if dtype is not None: |
1204 | | - dtype = pandas_dtype(dtype) |
1205 | | - if not is_period_dtype(dtype): |
1206 | | - raise ValueError('dtype must be PeriodDtype') |
1207 | | - if freq is None: |
1208 | | - freq = dtype.freq |
1209 | | - elif freq != dtype.freq: |
1210 | | - raise IncompatibleFrequency('specified freq and dtype ' |
1211 | | - 'are different') |
1212 | | - return freq |
1213 | | - |
1214 | | - |
1215 | 1176 | def _ensure_datetimelike_to_i8(other, to_utc=False): |
1216 | 1177 | """ |
1217 | 1178 | Helper for coercing an input scalar or array to i8. |
|
0 commit comments