使用pandas.PeriodIndex时配置日期解析器

时间:2017-04-12 10:00:09

标签: python pandas

我有这种格式的日期列表:

>>> 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有效范围之外的日期。

1 个答案:

答案 0 :(得分:2)

使用to_datetimeformat字符串创建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')