Pandas - 从DateTimeIndex创建列

时间:2015-08-02 13:03:06

标签: python pandas

我有一个带有datetimeindex的pandas DataFrame。我想创建一个label列,该列由我的数据的年份和月份组成。

我发现的方法是制作一个列的副本并对其进行操作(我必须这样做,因为DateTimeIndex没有apply方法)。我确信必须有一种方法直接对索引进行操作,但我找不到它:

import pandas  as pd
import numpy as np


df = pd.DataFrame(index=pd.date_range(start="2012-01-01", end="2013-01-01", freq='D'), data=range(367))

monthly = df.resample("M")
monthly["label"] = monthly.index
monthly["label"] = monthly["label"].apply(lambda x: x.strftime("%Y-%m"))

monthly.head()给我的地方:

                0    label
2012-01-31   15.0  2012-01
2012-02-29   45.0  2012-02
2012-03-31   75.0  2012-03
2012-04-30  105.5  2012-04
2012-05-31  136.0  2012-05

这正是我想要的,我只想在没有源代码中的第二行作为解决方法的情况下这样做。

2 个答案:

答案 0 :(得分:5)

可能有一种更直接的方式来获得strftime结果,但是通常当你想要将一个Index视为一个列而不实际为一个列时,你可以改为调用.to_series()

>>> monthly.index.to_series().head()
2012-01-31   2012-01-31
2012-02-29   2012-02-29
2012-03-31   2012-03-31
2012-04-30   2012-04-30
2012-05-31   2012-05-31
Freq: M, dtype: datetime64[ns]
>>> monthly.index.to_series().apply(lambda x: x.strftime("%Y-%m")).head()
2012-01-31    2012-01
2012-02-29    2012-02
2012-03-31    2012-03
2012-04-30    2012-04
2012-05-31    2012-05
Freq: M, dtype: object

答案 1 :(得分:2)

另一种方法是使用np.array将日期转换为<M8[M]每月。

df.index.values.astype('<M8[M]').astype(str)

array(['2012-01', '2012-01', '2012-01', ..., '2012-12', '2012-12', '2013-01'], 
      dtype='<U25')