Skip to content

Commit

Permalink
Backport PR #52220 on branch 2.0.x (BUG: zero-pad shorter years in `T…
Browse files Browse the repository at this point in the history
…imestamp.isoformat`) (#52327)

Backport PR #52220: BUG: zero-pad shorter years in `Timestamp.isoformat`

Co-authored-by: Justus Magin <keewis@users.noreply.github.com>
  • Loading branch information
meeseeksmachine and keewis authored Mar 31, 2023
1 parent 845a38b commit 367a5a2
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 13 deletions.
2 changes: 1 addition & 1 deletion pandas/_libs/tslibs/timestamps.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -1012,7 +1012,7 @@ cdef class _Timestamp(ABCTimestamp):
base_ts = "microseconds" if timespec == "nanoseconds" else timespec
base = super(_Timestamp, self).isoformat(sep=sep, timespec=base_ts)
# We need to replace the fake year 1970 with our real year
base = f"{self.year}-" + base.split("-", 1)[1]
base = f"{self.year:04d}-" + base.split("-", 1)[1]

if self.nanosecond == 0 and timespec != "nanoseconds":
return base
Expand Down
16 changes: 4 additions & 12 deletions pandas/tests/scalar/timestamp/test_constructors.py
Original file line number Diff line number Diff line change
Expand Up @@ -593,21 +593,13 @@ def test_bounds_with_different_units(self):
@pytest.mark.parametrize("arg", ["001-01-01", "0001-01-01"])
def test_out_of_bounds_string_consistency(self, arg):
# GH 15829
msg = "|".join(
[
"Cannot cast 1-01-01 00:00:00 to unit='ns' without overflow",
"Out of bounds nanosecond timestamp: 1-01-01 00:00:00",
]
)
msg = "Cannot cast 0001-01-01 00:00:00 to unit='ns' without overflow"
with pytest.raises(OutOfBoundsDatetime, match=msg):
Timestamp(arg).as_unit("ns")

if arg == "0001-01-01":
# only the 4-digit year goes through ISO path which gets second reso
# instead of ns reso
ts = Timestamp(arg)
assert ts.unit == "s"
assert ts.year == ts.month == ts.day == 1
ts = Timestamp(arg)
assert ts.unit == "s"
assert ts.year == ts.month == ts.day == 1

def test_min_valid(self):
# Ensure that Timestamp.min is a valid Timestamp
Expand Down
11 changes: 11 additions & 0 deletions pandas/tests/scalar/timestamp/test_formats.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,15 @@
second=8,
microsecond=132263,
)
ts_no_ns_year1 = Timestamp(
year=1,
month=5,
day=18,
hour=15,
minute=17,
second=8,
microsecond=132263,
)
ts_ns = Timestamp(
year=2019,
month=5,
Expand Down Expand Up @@ -50,6 +59,8 @@
(ts_no_ns, "auto", "2019-05-18T15:17:08.132263"),
(ts_no_ns, "seconds", "2019-05-18T15:17:08"),
(ts_no_ns, "nanoseconds", "2019-05-18T15:17:08.132263000"),
(ts_no_ns_year1, "seconds", "0001-05-18T15:17:08"),
(ts_no_ns_year1, "nanoseconds", "0001-05-18T15:17:08.132263000"),
(ts_ns, "auto", "2019-05-18T15:17:08.132263123"),
(ts_ns, "hours", "2019-05-18T15"),
(ts_ns, "minutes", "2019-05-18T15:17"),
Expand Down

0 comments on commit 367a5a2

Please sign in to comment.