将字符串转换为日期时间 - 无法解析“Feb”月份

4
我有一系列以下格式的字符串对象:
lcd['dates'] = ['Sep-2014', 'Feb-2014', 'Apr-2014', 'Oct-2013', 'Oct-2014',...]

我正在尝试将它们转换为日期时间格式(四舍五入到天),如下所示:
lcd['new dates'] = [pd.to_datetime(j, unit = "D",exact=False) for j in lcd.dates]

这似乎适用于所有月份,除了二月:
In: lcd['new_dates'].unique():

Out:Timestamp('2013-05-29 00:00:00'), Timestamp('2015-03-29 00:00:00'),
   Timestamp('2012-06-29 00:00:00'), 'Feb-2015',
   Timestamp('2012-12-29 00:00:00'), Timestamp('2014-07-29 00:00:00'),
   Timestamp('2014-09-29 00:00:00'), 'Feb-2014',...

我被难住了。
3个回答

3
您可以这样指定格式:
import pandas as pd

lcd = ['Sep-2014', 'Feb-2014', 'Feb-2015', 'Apr-2014', 'Oct-2013', 'Oct-2014',]
lcd = [pd.to_datetime(j, unit = "D", format='%b-%Y') for j in lcd]
print lcd

输出:

[Timestamp('2014-09-01 00:00:00'), Timestamp('2014-02-01 00:00:00'), Timestamp('2015-02-01 00:00:00'), Timestamp('2014-04-01 00:00:00'), Timestamp('2013-10-01 00:00:00'), Timestamp('2014-10-01 00:00:00')]

另外,您可以查看datetime的所有格式选项。


2

to_datetime()函数有一个format参数,它应该强制以特定方式进行解释。我打赌2月份失败的原因是今天是29号,这通常对于二月来说不合适。 (请注意,其他日期中有29日。我猜它正在出于某种原因用当前日期替换未指定的日期。)


1
是的。dateutil库在内部使用,它将尝试使用当前日期填充缺失的日期组件。因此:datetime.datetime(2015, 3, 30, 0, 0) 是解析仅包含“三月”(默认年份和日期)的结果。 - Jon Clements

1

使用Period可使这样的数据易于阅读。如果您希望,您总是可以转换为时间戳(并控制如何转换,例如月份的第一天或最后一天)。

In [1]: PeriodIndex([ Period(p,'M') for p in ['Sep-2014', 'Feb-2014', 'Apr-2014', 'Oct-2013', 'Oct-2014'] ])
Out[1]: PeriodIndex(['2014-09', '2014-02', '2014-04', '2013-10', '2014-10'], dtype='int64', freq='M')

In [2]: PeriodIndex([ Period(p,'M') for p in ['Sep-2014', 'Feb-2014', 'Apr-2014', 'Oct-2013', 'Oct-2014'] ]).to_timestamp()
Out[2]: DatetimeIndex(['2014-09-01', '2014-02-01', '2014-04-01', '2013-10-01', '2014-10-01'], dtype='datetime64[ns]', freq=None, tz=None)

这里简要提到了此处

只是为了更明确:Period(p, 'M') 描述了一个 的时间段(从 p 的第一天开始)——它并不指示 Pandas 解析“月份”+年份的格式。参考:http://pandas.pydata.org/pandas-docs/stable/timeseries.html#period。 - Eric O. Lebigot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接