我有一个这种格式的日期列表:
>>> dates = ["01/01/2000", "02/01/2000", "25/01/2000", "01/01/3005"]
我想从这些日期创建一个pandas.PeriodIndex
。但请注意,这些日期是英国格式,而不是美国格式,因此"02/01/2000"是 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')
熊猫中的其他函数接受处理这种情况的"Day First"参数。我该如何解决此问题?
编辑:我还应该提到我正在使用句点而不是时间戳,因为我需要使用时间戳有效范围之外的日期。
将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')