<p>你说得对,你需要做的是一个DatetimeIndex对象,而不仅仅是一列datetimes。不过,这非常简单—只需将其包装在DatetimeIndex构造函数中:</p>
<pre><code>In [11]: df = pd.DataFrame(pd.date_range('2014-01-01', freq='2w', periods=12))
In [12]: df
Out[12]:
0
0 2014-01-05
1 2014-01-19
2 2014-02-02
3 2014-02-16
4 2014-03-02
5 2014-03-16
6 2014-03-30
7 2014-04-13
8 2014-04-27
9 2014-05-11
10 2014-05-25
11 2014-06-08
In [13]: pd.DatetimeIndex(df[0]).to_period('M')
Out[13]:
<class 'pandas.tseries.period.PeriodIndex'>
freq: M
[2014-01, ..., 2014-06]
length: 12
</code></pre>
<p><em>这是一个周期索引,但您可以将其设为列:</em></p>
<pre><code>In [14]: df[1] = pd.DatetimeIndex(df[0]).to_period('M')
In [15]: df
Out[15]:
0 1
0 2014-01-05 2014-01
1 2014-01-19 2014-01
2 2014-02-02 2014-02
3 2014-02-16 2014-02
4 2014-03-02 2014-03
5 2014-03-16 2014-03
6 2014-03-30 2014-03
7 2014-04-13 2014-04
8 2014-04-27 2014-04
9 2014-05-11 2014-05
10 2014-05-25 2014-05
11 2014-06-08 2014-06
</code></pre>
<p><em>如果时间戳是多索引的一部分,则可以执行类似的技巧,方法是提取“column”<strike>并按上述方式将其传递到DatetimeIndex<strike>,例如使用<a href="http://pandas.pydata.org/pandas-docs/stable/indexing.html#reconstructing-the-level-labels" rel="noreferrer">^{<cd1>}</a>:</em><br/>
例如:</p>
<pre><code>df[2] = 2
df.set_index([0, 1], inplace=True)
df.index.get_level_values(0) # returns a DatetimeIndex
</code></pre>