Skip to content

Commit 816d5c2

Browse files
author
MomIsBestFriend
committed
Merge remote-tracking branch 'upstream/master' into CI-TestCase-#29886
2 parents 4ec7af6 + 66038e9 commit 816d5c2

File tree

9 files changed

+97
-75
lines changed

9 files changed

+97
-75
lines changed

ci/run_tests.sh

+3-2
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ echo $PYTEST_CMD
3737
sh -c "$PYTEST_CMD"
3838

3939
if [[ "$COVERAGE" && $? == 0 && "$TRAVIS_BRANCH" == "master" ]]; then
40+
SHA=`git rev-parse HEAD`
4041
echo "uploading coverage"
41-
echo "bash <(curl -s https://codecov.io/bash) -Z -c -F $TYPE -f $COVERAGE_FNAME"
42-
bash <(curl -s https://codecov.io/bash) -Z -c -F $TYPE -f $COVERAGE_FNAME
42+
echo "bash <(curl -s https://codecov.io/bash) -Z -c -F $TYPE -f $COVERAGE_FNAME -C $SHA"
43+
bash <(curl -s https://codecov.io/bash) -Z -c -F $TYPE -f $COVERAGE_FNAME -C `git rev-parse HEAD`
4344
fi

doc/source/user_guide/io.rst

-1
Original file line numberDiff line numberDiff line change
@@ -4828,7 +4828,6 @@ See also some :ref:`cookbook examples <cookbook.sql>` for some advanced strategi
48284828
The key functions are:
48294829

48304830
.. autosummary::
4831-
:toctree: ../reference/api/
48324831

48334832
read_sql_table
48344833
read_sql_query

doc/source/whatsnew/v1.0.0.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -712,7 +712,7 @@ Datetimelike
712712
- Bug in :func:`pandas.to_datetime` when called with ``None`` raising ``TypeError`` instead of returning ``NaT`` (:issue:`30011`)
713713
- Bug in :func:`pandas.to_datetime` failing for `deques` when using ``cache=True`` (the default) (:issue:`29403`)
714714
- Bug in :meth:`Series.item` with ``datetime64`` or ``timedelta64`` dtype, :meth:`DatetimeIndex.item`, and :meth:`TimedeltaIndex.item` returning an integer instead of a :class:`Timestamp` or :class:`Timedelta` (:issue:`30175`)
715-
-
715+
- Bug in :class:`DatetimeIndex` addition when adding a non-optimized :class:`DateOffset` incorrectly dropping timezone information (:issue:`30336`)
716716

717717
Timedelta
718718
^^^^^^^^^

pandas/core/arrays/datetimes.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -794,16 +794,17 @@ def _add_offset(self, offset):
794794
values = self.tz_localize(None)
795795
else:
796796
values = self
797-
result = offset.apply_index(values)
798-
if self.tz is not None:
799-
result = result.tz_localize(self.tz)
797+
result = offset.apply_index(values).tz_localize(self.tz)
800798

801799
except NotImplementedError:
802800
warnings.warn(
803801
"Non-vectorized DateOffset being applied to Series or DatetimeIndex",
804802
PerformanceWarning,
805803
)
806804
result = self.astype("O") + offset
805+
if len(self) == 0:
806+
# _from_sequence won't be able to infer self.tz
807+
return type(self)._from_sequence(result).tz_localize(self.tz)
807808

808809
return type(self)._from_sequence(result, freq="infer")
809810

pandas/core/frame.py

+4-8
Original file line numberDiff line numberDiff line change
@@ -1745,7 +1745,7 @@ def to_records(self, index=True, column_dtypes=None, index_dtypes=None):
17451745
rec.array([(b'a', 1, 0.5 ), (b'b', 2, 0.75)],
17461746
dtype=[('I', 'S2'), ('A', '<i8'), ('B', '<f8')])
17471747
1748-
>>> index_dtypes = "<S{}".format(df.index.str.len().max())
1748+
>>> index_dtypes = f"<S{df.index.str.len().max()}"
17491749
>>> df.to_records(index_dtypes=index_dtypes)
17501750
rec.array([(b'a', 1, 0.5 ), (b'b', 2, 0.75)],
17511751
dtype=[('I', 'S1'), ('A', '<i8'), ('B', '<f8')])
@@ -2355,13 +2355,9 @@ def _sizeof_fmt(num, size_qualifier):
23552355
# returns size in human readable format
23562356
for x in ["bytes", "KB", "MB", "GB", "TB"]:
23572357
if num < 1024.0:
2358-
return "{num:3.1f}{size_q} {x}".format(
2359-
num=num, size_q=size_qualifier, x=x
2360-
)
2358+
return f"{num:3.1f}{size_qualifier} {x}"
23612359
num /= 1024.0
2362-
return "{num:3.1f}{size_q} {pb}".format(
2363-
num=num, size_q=size_qualifier, pb="PB"
2364-
)
2360+
return f"{num:3.1f}{size_qualifier} PB"
23652361

23662362
if verbose:
23672363
_verbose_repr()
@@ -2374,7 +2370,7 @@ def _sizeof_fmt(num, size_qualifier):
23742370
_verbose_repr()
23752371

23762372
counts = self._data.get_dtype_counts()
2377-
dtypes = ["{k}({kk:d})".format(k=k[0], kk=k[1]) for k in sorted(counts.items())]
2373+
dtypes = [f"{k[0]}({k[1]:d})" for k in sorted(counts.items())]
23782374
lines.append(f"dtypes: {', '.join(dtypes)}")
23792375

23802376
if memory_usage is None:

pandas/core/generic.py

+31-48
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,8 @@ def _single_replace(self, to_replace, method, inplace, limit):
117117
"""
118118
if self.ndim != 1:
119119
raise TypeError(
120-
"cannot replace {0} with method {1} on a {2}".format(
121-
to_replace, method, type(self).__name__
122-
)
120+
f"cannot replace {to_replace} with method {method} on a "
121+
f"{type(self).__name__}"
123122
)
124123

125124
orig_dtype = self.dtype
@@ -254,7 +253,7 @@ def _validate_dtype(self, dtype):
254253
if dtype.kind == "V":
255254
raise NotImplementedError(
256255
"compound dtypes are not implemented"
257-
" in the {0} constructor".format(type(self).__name__)
256+
f" in the {type(self).__name__} constructor"
258257
)
259258

260259
return dtype
@@ -396,7 +395,7 @@ def _get_axis_number(cls, axis):
396395
return cls._AXIS_NUMBERS[axis]
397396
except KeyError:
398397
pass
399-
raise ValueError("No axis named {0} for object type {1}".format(axis, cls))
398+
raise ValueError(f"No axis named {axis} for object type {cls}")
400399

401400
@classmethod
402401
def _get_axis_name(cls, axis):
@@ -409,7 +408,7 @@ def _get_axis_name(cls, axis):
409408
return cls._AXIS_NAMES[axis]
410409
except KeyError:
411410
pass
412-
raise ValueError("No axis named {0} for object type {1}".format(axis, cls))
411+
raise ValueError(f"No axis named {axis} for object type {cls}")
413412

414413
def _get_axis(self, axis):
415414
name = self._get_axis_name(axis)
@@ -437,7 +436,7 @@ def _get_axis_resolvers(self, axis):
437436
# prefix with 'i' or 'c' depending on the input axis
438437
# e.g., you must do ilevel_0 for the 0th level of an unnamed
439438
# multiiindex
440-
key = "{prefix}level_{i}".format(prefix=prefix, i=i)
439+
key = f"{prefix}level_{i}"
441440
level = i
442441

443442
level_values = axis_index.get_level_values(level)
@@ -1082,7 +1081,7 @@ def rename(self, *args, **kwargs):
10821081
if kwargs:
10831082
raise TypeError(
10841083
"rename() got an unexpected keyword "
1085-
'argument "{0}"'.format(list(kwargs.keys())[0])
1084+
f'argument "{list(kwargs.keys())[0]}"'
10861085
)
10871086

10881087
if com.count_not_none(*axes.values()) == 0:
@@ -1108,7 +1107,7 @@ def rename(self, *args, **kwargs):
11081107
missing_labels = [
11091108
label for index, label in enumerate(v) if indexer[index] == -1
11101109
]
1111-
raise KeyError("{} not found in axis".format(missing_labels))
1110+
raise KeyError(f"{missing_labels} not found in axis")
11121111

11131112
result._data = result._data.rename_axis(
11141113
f, axis=baxis, copy=copy, level=level
@@ -1257,7 +1256,7 @@ class name
12571256
if kwargs:
12581257
raise TypeError(
12591258
"rename_axis() got an unexpected keyword "
1260-
'argument "{0}"'.format(list(kwargs.keys())[0])
1259+
f'argument "{list(kwargs.keys())[0]}"'
12611260
)
12621261

12631262
inplace = validate_bool_kwarg(inplace, "inplace")
@@ -1461,9 +1460,7 @@ def __neg__(self):
14611460
):
14621461
arr = operator.neg(values)
14631462
else:
1464-
raise TypeError(
1465-
"Unary negative expects numeric dtype, not {}".format(values.dtype)
1466-
)
1463+
raise TypeError(f"Unary negative expects numeric dtype, not {values.dtype}")
14671464
return self.__array_wrap__(arr)
14681465

14691466
def __pos__(self):
@@ -1477,9 +1474,7 @@ def __pos__(self):
14771474
):
14781475
arr = operator.pos(values)
14791476
else:
1480-
raise TypeError(
1481-
"Unary plus expects numeric dtype, not {}".format(values.dtype)
1482-
)
1477+
raise TypeError(f"Unary plus expects numeric dtype, not {values.dtype}")
14831478
return self.__array_wrap__(arr)
14841479

14851480
def __invert__(self):
@@ -1492,10 +1487,8 @@ def __invert__(self):
14921487

14931488
def __nonzero__(self):
14941489
raise ValueError(
1495-
"The truth value of a {0} is ambiguous. "
1496-
"Use a.empty, a.bool(), a.item(), a.any() or a.all().".format(
1497-
type(self).__name__
1498-
)
1490+
f"The truth value of a {type(self).__name__} is ambiguous. "
1491+
"Use a.empty, a.bool(), a.item(), a.any() or a.all()."
14991492
)
15001493

15011494
__bool__ = __nonzero__
@@ -1519,7 +1512,7 @@ def bool(self):
15191512
elif is_scalar(v):
15201513
raise ValueError(
15211514
"bool cannot act on a non-boolean single element "
1522-
"{0}".format(type(self).__name__)
1515+
f"{type(self).__name__}"
15231516
)
15241517

15251518
self.__nonzero__()
@@ -1659,14 +1652,8 @@ def _check_label_or_level_ambiguity(self, key, axis: int = 0) -> None:
16591652
)
16601653

16611654
msg = (
1662-
"'{key}' is both {level_article} {level_type} level and "
1663-
"{label_article} {label_type} label, which is ambiguous."
1664-
).format(
1665-
key=key,
1666-
level_article=level_article,
1667-
level_type=level_type,
1668-
label_article=label_article,
1669-
label_type=label_type,
1655+
f"'{key}' is both {level_article} {level_type} level and "
1656+
f"{label_article} {label_type} label, which is ambiguous."
16701657
)
16711658
raise ValueError(msg)
16721659

@@ -1731,12 +1718,8 @@ def _get_label_or_level_values(self, key: str, axis: int = 0) -> np.ndarray:
17311718
label_axis_name = "column" if axis == 0 else "index"
17321719
raise ValueError(
17331720
(
1734-
"The {label_axis_name} label '{key}' "
1735-
"is not unique.{multi_message}"
1736-
).format(
1737-
key=key,
1738-
label_axis_name=label_axis_name,
1739-
multi_message=multi_message,
1721+
f"The {label_axis_name} label '{key}' "
1722+
f"is not unique.{multi_message}"
17401723
)
17411724
)
17421725

@@ -1780,8 +1763,8 @@ def _drop_labels_or_levels(self, keys, axis: int = 0):
17801763
raise ValueError(
17811764
(
17821765
"The following keys are not valid labels or "
1783-
"levels for axis {axis}: {invalid_keys}"
1784-
).format(axis=axis, invalid_keys=invalid_keys)
1766+
f"levels for axis {axis}: {invalid_keys}"
1767+
)
17851768
)
17861769

17871770
# Compute levels and labels to drop
@@ -1998,7 +1981,7 @@ def __setstate__(self, state):
19981981
def __repr__(self) -> str:
19991982
# string representation based upon iterating over self
20001983
# (since, by definition, `PandasContainers` are iterable)
2001-
prepr = "[%s]" % ",".join(map(pprint_thing, self))
1984+
prepr = f"[{','.join(map(pprint_thing, self))}]"
20021985
return f"{type(self).__name__}({prepr})"
20031986

20041987
def _repr_latex_(self):
@@ -3946,13 +3929,13 @@ def _drop_axis(self, labels, axis, level=None, errors: str = "raise"):
39463929

39473930
# GH 18561 MultiIndex.drop should raise if label is absent
39483931
if errors == "raise" and indexer.all():
3949-
raise KeyError("{} not found in axis".format(labels))
3932+
raise KeyError(f"{labels} not found in axis")
39503933
else:
39513934
indexer = ~axis.isin(labels)
39523935
# Check if label doesn't exist along axis
39533936
labels_missing = (axis.get_indexer_for(labels) == -1).any()
39543937
if errors == "raise" and labels_missing:
3955-
raise KeyError("{} not found in axis".format(labels))
3938+
raise KeyError(f"{labels} not found in axis")
39563939

39573940
slicer = [slice(None)] * self.ndim
39583941
slicer[self._get_axis_number(axis_name)] = indexer
@@ -4476,7 +4459,7 @@ def reindex(self, *args, **kwargs):
44764459
if kwargs:
44774460
raise TypeError(
44784461
"reindex() got an unexpected keyword "
4479-
'argument "{0}"'.format(list(kwargs.keys())[0])
4462+
f'argument "{list(kwargs.keys())[0]}"'
44804463
)
44814464

44824465
self._consolidate_inplace()
@@ -5997,7 +5980,7 @@ def fillna(
59975980
raise TypeError(
59985981
'"value" parameter must be a scalar, dict '
59995982
"or Series, but you passed a "
6000-
'"{0}"'.format(type(value).__name__)
5983+
f'"{type(value).__name__}"'
60015984
)
60025985

60035986
new_data = self._data.fillna(
@@ -6781,9 +6764,9 @@ def interpolate(
67816764
if method not in methods and not is_numeric_or_datetime:
67826765
raise ValueError(
67836766
"Index column must be numeric or datetime type when "
6784-
"using {method} method other than linear. "
6767+
f"using {method} method other than linear. "
67856768
"Try setting a numeric or datetime index column before "
6786-
"interpolating.".format(method=method)
6769+
"interpolating."
67876770
)
67886771

67896772
if isna(index).any():
@@ -9205,7 +9188,7 @@ def _tz_convert(ax, tz):
92059188
ax = ax.set_levels(new_level, level=level)
92069189
else:
92079190
if level not in (None, 0, ax.name):
9208-
raise ValueError("The level {0} is not valid".format(level))
9191+
raise ValueError(f"The level {level} is not valid")
92099192
ax = _tz_convert(ax, tz)
92109193

92119194
result = self._constructor(self._data, copy=copy)
@@ -9375,7 +9358,7 @@ def _tz_localize(ax, tz, ambiguous, nonexistent):
93759358
ax = ax.set_levels(new_level, level=level)
93769359
else:
93779360
if level not in (None, 0, ax.name):
9378-
raise ValueError("The level {0} is not valid".format(level))
9361+
raise ValueError(f"The level {level} is not valid")
93799362
ax = _tz_localize(ax, tz, ambiguous, nonexistent)
93809363

93819364
result = self._constructor(self._data, copy=copy)
@@ -10357,8 +10340,8 @@ def last_valid_index(self):
1035710340

1035810341
def _doc_parms(cls):
1035910342
"""Return a tuple of the doc parms."""
10360-
axis_descr = "{%s}" % ", ".join(
10361-
"{0} ({1})".format(a, i) for i, a in enumerate(cls._AXIS_ORDERS)
10343+
axis_descr = (
10344+
f"{{{', '.join(f'{a} ({i})' for i, a in enumerate(cls._AXIS_ORDERS))}}}"
1036210345
)
1036310346
name = cls._constructor_sliced.__name__ if cls._AXIS_LEN > 1 else "scalar"
1036410347
name2 = cls.__name__

pandas/core/indexers.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,7 @@ def validate_indices(indices: np.ndarray, n: int) -> None:
144144
if len(indices):
145145
min_idx = indices.min()
146146
if min_idx < -1:
147-
msg = "'indices' contains values less than allowed ({} < {})".format(
148-
min_idx, -1
149-
)
147+
msg = f"'indices' contains values less than allowed ({min_idx} < -1)"
150148
raise ValueError(msg)
151149

152150
max_idx = indices.max()

pandas/core/strings.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ def cat_safe(list_of_columns: List, sep: str):
113113
raise TypeError(
114114
"Concatenation requires list-likes containing only "
115115
"strings (or missing values). Offending values found in "
116-
"column {}".format(dtype)
116+
f"column {dtype}"
117117
) from None
118118
return result
119119

@@ -1355,8 +1355,8 @@ def str_find(arr, sub, start=0, end=None, side="left"):
13551355
"""
13561356

13571357
if not isinstance(sub, str):
1358-
msg = "expected a string object, not {0}"
1359-
raise TypeError(msg.format(type(sub).__name__))
1358+
msg = f"expected a string object, not {type(sub).__name__}"
1359+
raise TypeError(msg)
13601360

13611361
if side == "left":
13621362
method = "find"
@@ -1375,8 +1375,8 @@ def str_find(arr, sub, start=0, end=None, side="left"):
13751375

13761376
def str_index(arr, sub, start=0, end=None, side="left"):
13771377
if not isinstance(sub, str):
1378-
msg = "expected a string object, not {0}"
1379-
raise TypeError(msg.format(type(sub).__name__))
1378+
msg = f"expected a string object, not {type(sub).__name__}"
1379+
raise TypeError(msg)
13801380

13811381
if side == "left":
13821382
method = "index"
@@ -1447,15 +1447,15 @@ def str_pad(arr, width, side="left", fillchar=" "):
14471447
dtype: object
14481448
"""
14491449
if not isinstance(fillchar, str):
1450-
msg = "fillchar must be a character, not {0}"
1451-
raise TypeError(msg.format(type(fillchar).__name__))
1450+
msg = f"fillchar must be a character, not {type(fillchar).__name__}"
1451+
raise TypeError(msg)
14521452

14531453
if len(fillchar) != 1:
14541454
raise TypeError("fillchar must be a character, not str")
14551455

14561456
if not is_integer(width):
1457-
msg = "width must be of integer type, not {0}"
1458-
raise TypeError(msg.format(type(width).__name__))
1457+
msg = f"width must be of integer type, not {type(width).__name__}"
1458+
raise TypeError(msg)
14591459

14601460
if side == "left":
14611461
f = lambda x: x.rjust(width, fillchar)

0 commit comments

Comments
 (0)