Pandas: Typkonvertierung mit `df.loc` von datetime64 nach int

Beim Versuch, bestimmte Werte in einer Spalte mit @ neu zuzuweisdf.loc[] Ich erhalte einen seltsamen Typkonvertierungsfehler beim Konvertieren von Datumsangaben in Ganzzahlen.

Minimales Beispiel:

import numpy as np
import pandas as pd
import datetime
d = pd.DataFrame(zip(['12/6/2015', np.nan], [1, 2]), columns=list('ab'))
print(d)
d.loc[pd.notnull(d.a), 'a'] = d.a[pd.notnull(d.a)].apply(lambda x: datetime.datetime(2015,12,6))
print(d)

Volles Beispiel:

Hier ist mein Datenrahmen (enthält NaNs):

>>> df.head()

  prior_ea_date quarter
0    12/31/2015      Q2
1    12/31/2015      Q3
2    12/31/2015      Q3
3    12/31/2015      Q3
4    12/31/2015      Q2

>>> df.prior_ea_date

0         12/31/2015
1         12/31/2015
...
341486     1/19/2016
341487      1/6/2016
Name: prior_ea_date, dtype: object

Ich möchte die folgende Codezeile ausführen:

df.loc[pd.notnull(df.prior_ea_date), 'prior_ea_date'] = df.prior_ea_date[pd.notnull(df.prior_ea_date)].apply(dt, usa=True)

wodt ist eine Zeichenfolge für den datetime-Parser, die beim Ausführen normalerweise Folgendes ergibt:

>>> df.prior_ea_date[pd.notnull(df.prior_ea_date)].apply(dt, usa=True).head()

0   2015-12-31
1   2015-12-31
2   2015-12-31
3   2015-12-31
4   2015-12-31
Name: prior_ea_date, dtype: datetime64[ns]

Allerdings, wenn ich das @ ausführ.loc[] Ich bekomme folgendes:

>>> df.loc[pd.notnull(df.prior_ea_date), 'prior_ea_date'] = df.prior_ea_date[pd.notnull(df.prior_ea_date)].apply(dt, usa=True)
>>> df.head()

         prior_ea_date quarter
0  1451520000000000000      Q2
1  1451520000000000000      Q3
2  1451520000000000000      Q3
3  1451520000000000000      Q3
4  1451520000000000000      Q2

und es hat meine Datetime-Objekte in Ganzzahlen konvertiert.

Warum passiert diesWie vermeide ich dieses Verhalten?

Ich habe es geschafft, eine vorübergehende Lösung zu finden. Ich würde mich über einzeilige Hacks freuen, aber ich hätte gerne eine Lösung im Pandastil.

Vielen Dank

Antworten auf die Frage(2)

Ihre Antwort auf die Frage