2013-10-18 29 views
7

Ich möchte dtype einer Datenrahmenspalte ändern (von datetime64 zu Objekt).Wie ändert man dType einer Spalte in DataFrame?

Zunächst einmal erstellen I-Datenrahmen:

Python 2.6.8 (unknown, Jan 26 2013, 14:35:25) 
[GCC 4.7.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import pandas as pd 
>>> values = pd.Series(i for i in range(5)) 
>>> dates = pd.date_range('20130101',periods=5) 
>>> df = pd.DataFrame({'values': values, 'dates': dates}) 
>>> df 
/usr/local/lib/python2.6/dist-packages/pandas/core/config.py:570: DeprecationWarning: height has been deprecated. 

    warnings.warn(d.msg, DeprecationWarning) 
       dates values 
0 2013-01-01 00:00:00  0 
1 2013-01-02 00:00:00  1 
2 2013-01-03 00:00:00  2 
3 2013-01-04 00:00:00  3 
4 2013-01-05 00:00:00  4 

Es zwei Spalten: Die eine ist datetime64 und andere ist int64 dtype:

>>> df.dtypes 
dates  datetime64[ns] 
values    int64 
dtype: object 

In Pandas Dokumentation fand ich, wie zu konvertieren Reihe zu irgendwelchen dtypes. Es sieht aus wie das, was ich brauche:

>>> df['dates'].astype(object) 
0 2013-01-01 00:00:00 
1 2013-01-02 00:00:00 
2 2013-01-03 00:00:00 
3 2013-01-04 00:00:00 
4 2013-01-05 00:00:00 
Name: dates, dtype: object 

Aber wenn ich diese Serie als Datenrahmen Spalte zuweisen, bekam ich wieder einen datetime64 dtype.

>>> df['dates'] = df['dates'].astype(object) 
>>> df.dtypes 
dates  datetime64[ns] 
values    int64 
dtype: object 

Bitte helfen Sie. Wie konvertiert man die Spalte des Datenrahmens in den Objekttyp? Danke.

+0

warum versuchen Sie dies zu tun? Objektrepräsentation im Fall einer Datetime ist sehr ineffizient, also konvertiert Pandas intern. – Jeff

+0

Ich möchte datetime in Objekt konvertieren, weil Pandas einen Fehler haben (siehe http://stackoverflow.com/questions/19300730) in Pivot-Summen-Berechnung, wenn die Spalte (die als Header verwendet wird) Datetime ist. – ghostishev

+3

die Lösung in diesem Problem sieht gut aus, nur die Zeilen/Spalten zu transponieren. Was Sie versuchen zu tun, hat nichts mit '' datetime64 [ns] '' als D-Typ zu tun und wird nicht helfen. – Jeff

Antwort

0

Sind Sie danach?

In [9]: pd.pivot_table(data=df,rows='columns',cols='rows',values='values',margins=True).T 
Out[9]: 
columns 2013-01-01 00:00:00 2013-01-02 00:00:00 2013-01-03 00:00:00 2013-01-04 00:00:00 2013-01-05 00:00:00  All 
rows                              
a       0     NaN     2     3     NaN 1.666667 
b      NaN     1     NaN     NaN     4 2.500000 
All      0     1     2     3     4 2.000000 
3

Wenn Sie wirklich von Datentyp datetime64 ändern möchten [ns] zu widersprechen, könnten Sie so etwas wie folgt ausführen:

df['dates'] = df['dates'].apply(lambda x: str(x)) 
print df.types # Can verify to see that dates prints out as an object 
0

Nicht mit Lambda-Nutzung beherrschen. In einem einfachen Fall würde df['dates'].astype(str) auch funktionieren.

Hinweis: es funktioniert nicht, wenn NaN in einer Spalte sind.

Keine Lösung für OP, aber andere finden möglicherweise Hilfe in this question. Fast ein Duplikat, aber es geht hauptsächlich um Konvertieren in Zahlen.

Verwandte Themen