2016-06-13 22 views
1

Ich habe eine Python-Pandas Datenrahmen (pd_df) wie folgt:Pandas Datenrahmen (DatetimeIndex Spalte) funken Datenrahmen (Datumzeit-Format)

time    count 
0 2015-01-31   835 
1 2015-02-28   1693 
2 2015-03-31   2439 

, die ich umwandeln möchten Funke Datenrahmen (sp_df). Ich verwende den folgenden Befehl ein:

Als ich

sp_df = sqlContext.createDataFrame(pd_df). 

Die erste Spalte wurde versucht, in Bigint Format zurückgegeben.

time    count 
1422662400000000000 835 
1425081600000000000 1693 

Ich habe auch versucht, das Schema wie folgt aber es hat nicht funktioniert entweder:

from pyspark.sql.types import * 
schema = StructType([ 
    StructField("time", StringType(), True), 
    StructField("count", IntegerType(), True)]) 
sp_df = sqlContext.createDataFrame(pd_df, schema) 

Es mir den Fehler gab:

DateType can not accept object 1422662400000000000L in type <type 'long'> 

Kann jemand empfehlen, mir den richtigen Weg zu TU es?

+1

Der Grund dies geschieht, weil Ihr Pandas Dataframe Spalte hat den Datentyp 'DatetimeIndex' und wenn Sie [die Dokumentation] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DatetimeIndex.html) lesen, können Sie das Datum sehen intern als int64 dargestellt. Versuchen Sie, Ihre Datenstrings zu erstellen und konvertieren Sie sie dann in sp_df mit dem Datentyp 'DateType' –

+0

. Warum geben Sie in Ihrem 'StructField'-Objekt auch' time ', StringType(), True'? Warum nicht 'DateType()' verwenden? –

+1

Danke @KatyaHandler ..Die Idee der Umwandlung der Datetime in Strings half. Im StructField-Objekt wurde früher, als ich "time" übermittelte, als DateType() ein Fehler angezeigt. Jetzt, nach dem Konvertieren der Pandas Datetime in String und dann konvertiert es mit dem DateType() in StructField() gearbeitet. – aditya

Antwort

0

Was ich am Ende in der gleichen Situation getan habe, war zu verwenden, um die Datumsspalte (die für mich war ein int von Jahr Monatstag, dh 20150129) zu einem Datum mit Anwendung zu konvertieren. Erinnerung, das gilt gilt für jede Zeile der Tabelle und gibt das Ergebnis zurück.

import datetime 
pos_data['TRANSACTION_DATE_converted'] = pos_data.TRANSACTION_DATE.apply(lambda x: datetime.datetime.strptime(str(x),'%Y%m%d').date()) 

Dann habe ich createDataFrame, genau wie Sie, und lesen Sie das Datum. Es zeigt sich als

TRANSACTION_DATE_converted=datetime.date(2016, 9, 6) 

im Schema, aber das hat mir noch keine Probleme verursacht.

Hive speichert den Wert als gestrichelten String (dh 20140129), also werde ich das Datum in eine Zeichenfolge konvertieren, wenn es mir weitere Trauer bereitet. Allerdings ist das Durchlaufen zweier Datentypen etwas albern.

0

ich hatte das gleiche Problem, ist schnellste Weg, um die bigint als Unix-Zeitstempel, um zu sehen und es dann über eine Funken api Funktion (Zeitstempel oder Datum) konvertieren:

from_unixtime(df['time']/1000000000, format='yyyy-MM-dd HH:mm:ss').cast('timestamp') 
Verwandte Themen