2014-05-24 26 views
9

Tôi có một cột dấu thời gian cần được chuyển đổi thành dấu chấm ('Tháng'). ví dụ.Chuyển đổi cột dấu thời gian thành các khoảng thời gian trong gấu trúc

1985-12-31 00:00:00 to 1985-12 

Pandas có một chức năng .to_period, nhưng nó chỉ hoạt động cho chỉ số timestamps, không cột. Vì vậy, bạn chỉ có thể có một chỉ số thời gian, nhưng không chỉ có một cột thời gian?

Và nó chỉ hoạt động nếu dấu thời gian là chỉ mục duy nhất. Nghĩa là, nếu dấu thời gian là một phần của một multIndex, hàm .to_period() cũng không hoạt động.

Dường như Pandas giả định mọi người sẽ luôn sử dụng dấu thời gian và dấu chấm làm chỉ mục, nhưng không phải là một cột đơn lẻ, điều này rõ ràng không phải là trường hợp.

Dù sao thì tôi cũng có thể giải quyết vấn đề này? Hoặc nếu không ở Pandas, nó có thể được thực hiện trong numpy?

Cảm ơn!

Trả lời

17

Tôi đã xem qua chủ đề này ngày hôm nay, và sau khi tiếp tục đào cho thấy gấu trúc .15 dành một dễ dàng hơn tùy chọn sử dụng .dt, bạn có thể tránh được những bước của việc tạo ra một chỉ số và tạo cột trực tiếp. Bạn có thể sử dụng các mục sau để có được kết quả tương tự:

df[1] = df[0].dt.to_period('M') 
+0

Cảm ơn bạn, bài đăng hay! – user3576212

+0

Điều này không hoạt động: đối tượng 'DatetimeProperties' không có thuộc tính 'to_priod' –

7

Bạn nói đúng, bạn cần phải thực hiện một đối tượng DatetimeIndex này thay vì chỉ các cột của datetimes. Tuy nhiên, điều này là khá dễ dàng - chỉ cần bọc nó trong một constructor DatetimeIndex:

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 

Đây là một PeriodIndex, nhưng bạn có thể biến nó thành một cột:

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 

Bạn có thể làm tương tự lừa nếu dấu thời gian là một phần của MultiIndex bằng cách trích xuất "cột" và chuyển nó vào DatetimeIndex như trên , ví dụ: sử dụng df.index.get_level_values:
Ví dụ:

df[2] = 2 
df.set_index([0, 1], inplace=True) 
df.index.get_level_values(0) # returns a DatetimeIndex 
+0

Bạn có thể đưa ra ví dụ về chiết xuất chỉ số mức = 1 từ multiIndex dưới dạng cột không? – user3576212

+0

http://pandas.pydata.org/pandas-docs/stable/indexing.html#reconstructing-the-level-labels nghĩa là 'df.index.get_level_values ​​(1)', có vẻ như điều này trả về một DatetimeIndex nếu đây là ngày. –

+0

iirc điều này sẽ làm việc trong master/0.14.0 và ở lại một periodindex – Jeff

Các vấn đề liên quan