我有这种格式的日期列表:
>>> dates = ["01/01/2000", "02/01/2000", "25/01/2000", "01/01/3005"]
我想从这些日期创建pandas.PeriodIndex
。但请注意,这些日期是英国格式,而不是美国格式,所以" 02/01/02"是1月2日,而不是2月1日。pandas.PeriodIndex
的默认行为不起作用:
>>> pandas.PeriodIndex(dates, freq="D")
PeriodIndex(['2000-01-01', '2000-02-01', '2000-01-25', '3005-01-01'], dtype='period[D]', freq='D')
熊猫中的其他功能首先接受"第一天"处理这种情况的论据。我该如何解决这个问题?
编辑:我还应该提到我使用Period而不是Timestamp,因为我需要使用Timestamp有效范围之外的日期。
答案 0 :(得分:2)
使用to_datetime
和format
字符串创建DatetimeIndex
,这样就有to_period
方法为您转换为PeriodIndex
:
In [63]:
dates = ["01/01/2000", "02/01/2000", "25/01/2000"]
pd.to_datetime(dates, format='%d/%m/%Y').to_period(freq='D')
Out[63]:
PeriodIndex(['2000-01-01', '2000-01-02', '2000-01-25'], dtype='period[D]', freq='D')
您也可以传递dayFirst=True
:
In [64]:
dates = ["01/01/2000", "02/01/2000", "25/01/2000"]
pd.to_datetime(dates, dayfirst=True).to_period(freq='D')
Out[64]:
PeriodIndex(['2000-01-01', '2000-01-02', '2000-01-25'], dtype='period[D]', freq='D')
<强>更新强>
对于无效日期,您可以拆分字符串日期并转换为int
,然后将这些作为参数传递给PeriodIndex
ctor:
In [67]:
df = pd.DataFrame({'dates':dates})
df
Out[67]:
dates
0 01/01/2000
1 02/01/2000
2 25/01/2000
3 01/01/3005
In [72]:
df[['day','month','year']] = df['dates'].str.split('/', expand=True).astype(int)
df
Out[72]:
dates day month year
0 01/01/2000 1 1 2000
1 02/01/2000 2 1 2000
2 25/01/2000 25 1 2000
3 01/01/3005 1 1 3005
In [75]:
df['period'] = pd.PeriodIndex(day = df['day'], month=df['month'], year = df['year'], freq='D')
df
Out[75]:
dates day month year period
0 01/01/2000 1 1 2000 2000-01-01
1 02/01/2000 2 1 2000 2000-01-02
2 25/01/2000 25 1 2000 2000-01-25
3 01/01/3005 1 1 3005 3005-01-01
您可以看到这会产生所需的结果:
In [77]:
pd.PeriodIndex(day = df['day'], month=df['month'], year = df['year'], freq='D')
Out[77]:
PeriodIndex(['2000-01-01', '2000-01-02', '2000-01-25', '3005-01-01'], dtype='period[D]', freq='D')