将pandas日期时间月份转换为字符串表示形式

8

我想要一个带有时间戳列的pandas DataFrame,并且想要创建一个仅包含月份的列。我希望月份列是字符串表示,而不是整数。我已经做了如下操作:

df['Dates'] = pd.to_datetime(df['Dates'])
df['Month'] = df.Dates.dt.month
df['Month'] = df.Month.apply(lambda x: datetime.strptime(str(x), '%m').strftime('%b'))

然而,这是某种暴力方法,并不是非常高效。有没有更优雅的方式将月份的整数表示转换为字符串表示?

2个回答

18

使用向量化的dt.strftime方法处理日期时间:

In [43]:
df = pd.DataFrame({'dates':pd.date_range(dt.datetime(2016,1,1), dt.datetime(2017,2,1), freq='M')})
df

Out[43]:
        dates
0  2016-01-31
1  2016-02-29
2  2016-03-31
3  2016-04-30
4  2016-05-31
5  2016-06-30
6  2016-07-31
7  2016-08-31
8  2016-09-30
9  2016-10-31
10 2016-11-30
11 2016-12-31
12 2017-01-31

In [44]:    
df['month'] = df['dates'].dt.strftime('%b')
df

Out[44]:
        dates month
0  2016-01-31   Jan
1  2016-02-29   Feb
2  2016-03-31   Mar
3  2016-04-30   Apr
4  2016-05-31   May
5  2016-06-30   Jun
6  2016-07-31   Jul
7  2016-08-31   Aug
8  2016-09-30   Sep
9  2016-10-31   Oct
10 2016-11-30   Nov
11 2016-12-31   Dec
12 2017-01-31   Jan

当使用df['Dates'] = pd.to_datetime(df['Dates'])时,是否有一种方法可以将此方法与我的'Dates'列的np.datetime64格式一起使用? - farnold
当我使用这个解决方案时,我会得到以下错误`AttributeError:'DatetimeProperties'对象没有'strftime'属性。有什么想法吗? - farnold
好的,看起来我使用的是较旧的pandas版本,不支持这种类型的转换。 - farnold
1
反向操作怎么样? - famargar
2
@famargar 你只需要执行 pd.to_datetime(df['month'], format='%b'),这将生成一个默认的日期时间,该月份为所选月份。 - EdChum

8
对于版本 pandas 0.23.0+,可以使用dt.month_name
df['month'] = df['dates'].dt.month_name()
print (df)

        dates      month
0  2016-01-31    January
1  2016-02-29   February
2  2016-03-31      March
3  2016-04-30      April
4  2016-05-31        May
5  2016-06-30       June
6  2016-07-31       July
7  2016-08-31     August
8  2016-09-30  September
9  2016-10-31    October
10 2016-11-30   November
11 2016-12-31   December
12 2017-01-31    January

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