Skip to content

Commit df86724

Browse files
authored
Support all possible time units for Series.astype literals (#562)
* Support all possible time units for Series.astype literals * Update test to check all timedelta/timestamp dtype args in a loop * List out all of the individual string literals in astype test
1 parent 08d627b commit df86724

File tree

2 files changed

+163
-2
lines changed

2 files changed

+163
-2
lines changed

pandas-stubs/_typing.pyi

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,39 @@ ComplexDtypeArg: TypeAlias = (
146146
| type[np.complex128]
147147
| Literal["complex64", "complex128"]
148148
)
149-
TimedeltaDtypeArg: TypeAlias = Literal["timedelta64[ns]"]
150-
TimestampDtypeArg: TypeAlias = Literal["datetime64[ns]"]
149+
# Refer to https://numpy.org/doc/stable/reference/arrays.datetime.html#datetime-units
150+
TimedeltaDtypeArg: TypeAlias = Literal[
151+
"timedelta64[Y]",
152+
"timedelta64[M]",
153+
"timedelta64[W]",
154+
"timedelta64[D]",
155+
"timedelta64[h]",
156+
"timedelta64[m]",
157+
"timedelta64[s]",
158+
"timedelta64[ms]",
159+
"timedelta64[us]",
160+
"timedelta64[μs]",
161+
"timedelta64[ns]",
162+
"timedelta64[ps]",
163+
"timedelta64[fs]",
164+
"timedelta64[as]",
165+
]
166+
TimestampDtypeArg: TypeAlias = Literal[
167+
"datetime64[Y]",
168+
"datetime64[M]",
169+
"datetime64[W]",
170+
"datetime64[D]",
171+
"datetime64[h]",
172+
"datetime64[m]",
173+
"datetime64[s]",
174+
"datetime64[ms]",
175+
"datetime64[us]",
176+
"datetime64[μs]",
177+
"datetime64[ns]",
178+
"datetime64[ps]",
179+
"datetime64[fs]",
180+
"datetime64[as]",
181+
]
151182
CategoryDtypeArg: TypeAlias = CategoricalDtype | Literal["category"]
152183

153184
AstypeArg: TypeAlias = (

tests/test_series.py

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1571,17 +1571,147 @@ def test_updated_astype() -> None:
15711571
np.complex128,
15721572
)
15731573

1574+
check(
1575+
assert_type(s.astype("timedelta64[Y]"), TimedeltaSeries),
1576+
pd.Series,
1577+
Timedelta,
1578+
)
1579+
check(
1580+
assert_type(s.astype("timedelta64[M]"), TimedeltaSeries),
1581+
pd.Series,
1582+
Timedelta,
1583+
)
1584+
check(
1585+
assert_type(s.astype("timedelta64[W]"), TimedeltaSeries),
1586+
pd.Series,
1587+
Timedelta,
1588+
)
1589+
check(
1590+
assert_type(s.astype("timedelta64[D]"), TimedeltaSeries),
1591+
pd.Series,
1592+
Timedelta,
1593+
)
1594+
check(
1595+
assert_type(s.astype("timedelta64[h]"), TimedeltaSeries),
1596+
pd.Series,
1597+
Timedelta,
1598+
)
1599+
check(
1600+
assert_type(s.astype("timedelta64[m]"), TimedeltaSeries),
1601+
pd.Series,
1602+
Timedelta,
1603+
)
1604+
check(
1605+
assert_type(s.astype("timedelta64[s]"), TimedeltaSeries),
1606+
pd.Series,
1607+
Timedelta,
1608+
)
1609+
check(
1610+
assert_type(s.astype("timedelta64[ms]"), TimedeltaSeries),
1611+
pd.Series,
1612+
Timedelta,
1613+
)
1614+
check(
1615+
assert_type(s.astype("timedelta64[us]"), TimedeltaSeries),
1616+
pd.Series,
1617+
Timedelta,
1618+
)
1619+
check(
1620+
assert_type(s.astype("timedelta64[μs]"), TimedeltaSeries),
1621+
pd.Series,
1622+
Timedelta,
1623+
)
15741624
check(
15751625
assert_type(s.astype("timedelta64[ns]"), TimedeltaSeries),
15761626
pd.Series,
15771627
Timedelta,
15781628
)
1629+
check(
1630+
assert_type(s.astype("timedelta64[ps]"), TimedeltaSeries),
1631+
pd.Series,
1632+
Timedelta,
1633+
)
1634+
check(
1635+
assert_type(s.astype("timedelta64[fs]"), TimedeltaSeries),
1636+
pd.Series,
1637+
Timedelta,
1638+
)
1639+
check(
1640+
assert_type(s.astype("timedelta64[as]"), TimedeltaSeries),
1641+
pd.Series,
1642+
Timedelta,
1643+
)
15791644

1645+
check(
1646+
assert_type(s.astype("datetime64[Y]"), TimestampSeries),
1647+
pd.Series,
1648+
Timestamp,
1649+
)
1650+
check(
1651+
assert_type(s.astype("datetime64[M]"), TimestampSeries),
1652+
pd.Series,
1653+
Timestamp,
1654+
)
1655+
check(
1656+
assert_type(s.astype("datetime64[W]"), TimestampSeries),
1657+
pd.Series,
1658+
Timestamp,
1659+
)
1660+
check(
1661+
assert_type(s.astype("datetime64[D]"), TimestampSeries),
1662+
pd.Series,
1663+
Timestamp,
1664+
)
1665+
check(
1666+
assert_type(s.astype("datetime64[h]"), TimestampSeries),
1667+
pd.Series,
1668+
Timestamp,
1669+
)
1670+
check(
1671+
assert_type(s.astype("datetime64[m]"), TimestampSeries),
1672+
pd.Series,
1673+
Timestamp,
1674+
)
1675+
check(
1676+
assert_type(s.astype("datetime64[s]"), TimestampSeries),
1677+
pd.Series,
1678+
Timestamp,
1679+
)
1680+
check(
1681+
assert_type(s.astype("datetime64[ms]"), TimestampSeries),
1682+
pd.Series,
1683+
Timestamp,
1684+
)
1685+
check(
1686+
assert_type(s.astype("datetime64[us]"), TimestampSeries),
1687+
pd.Series,
1688+
Timestamp,
1689+
)
1690+
check(
1691+
assert_type(s.astype("datetime64[μs]"), TimestampSeries),
1692+
pd.Series,
1693+
Timestamp,
1694+
)
15801695
check(
15811696
assert_type(s.astype("datetime64[ns]"), TimestampSeries),
15821697
pd.Series,
15831698
Timestamp,
15841699
)
1700+
check(
1701+
assert_type(s.astype("datetime64[ps]"), TimestampSeries),
1702+
pd.Series,
1703+
Timestamp,
1704+
)
1705+
check(
1706+
assert_type(s.astype("datetime64[fs]"), TimestampSeries),
1707+
pd.Series,
1708+
Timestamp,
1709+
)
1710+
check(
1711+
assert_type(s.astype("datetime64[as]"), TimestampSeries),
1712+
pd.Series,
1713+
Timestamp,
1714+
)
15851715

15861716
orseries = pd.Series([Decimal(x) for x in [1, 2, 3]])
15871717
newtype = DecimalDtype()

0 commit comments

Comments
 (0)