Yeah, that does seem weird. You can coax a three-digit year out of it as well:
>>> pd.Period("01/01/101").strftime("%Y")
u'101'
I would have expected "0101".
Given that Python's time.strftime() function won't accept a year < 1900, it seems clear that pandas.Period relies on its own implementation of strftime(). My guess is it's buggy, though the documentation says:
| ``%Y`` | Year with century as a decimal | |
| | number. | |
so there is no guarantee that it will be four digits.
The worst they can do is close as "won't fix". Perhaps it will at least provoke a bit of discussion or documentation changes. In the meantime, I think your best bet is to experiment with input formats, find one which works as you expect, and format your inputs rigorously to avoid ambiguity. Given the head scratching I did while messing with hyphen-separated dates, it looks like fully padded dates in either of these formats are your best bet for now:
>>> pd.Period("01/02/2003")
Period('2003-01-02', 'D')
>>> pd.Period("2003-01-02")
Period('2003-01-02', 'D')
Skip