2016-06-13 3 views
1

У меня есть Python панд dataframe (pd_df) следующим образом:панды dataframe (колонка DatetimeIndex), чтобы зажечь dataframe (формат DateTime)

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

, который я хочу, чтобы преобразовать, чтобы зажечь dataframe (sp_df). Я использую следующую команду:

Когда я попытался

sp_df = sqlContext.createDataFrame(pd_df). 

Первый столбец был возвращен в BigInt формате.

time    count 
1422662400000000000 835 
1425081600000000000 1693 

Я также попробовал схему следующим образом, но это не сработало:

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

Он дал мне ошибку:

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

Может кто-нибудь предложить мне правильный путь к сделай это?

+1

Причина это происходит потому, что ваш В столбце dataframe pandas есть тип данных 'DatetimeIndex', и если вы читаете [документацию] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DatetimeIndex.html), вы можете видеть, что дата внутренне представлен как int64. Попробуйте сделать свои строки строк, а затем конвертируйте в sp_df с типом данных 'DateType' –

+0

Также почему в вашем объекте' StructField' вы проходите время '', StringType(), True'? Почему бы не использовать 'DateType()'? –

+1

Спасибо @ KatyaHandler. Идея преобразования даты и времени в строки помогла. В объекте StructField раньше, когда я проходил «время», как DateType(), я получал ошибку. Теперь, после преобразования pandas datetime в строку и затем преобразования его с использованием DateType() в StructField(). – aditya

ответ

0

То, что я в итоге делал в той же ситуации, это использовать для преобразования столбца даты (который для меня был int year year day, т.е. 20150129), к дате с использованием apply. Напоминание, которое применяет прогоны для каждой строки таблицы и возвращает результат.

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

Затем я использовал createDataFrame, так же как и вы, и он прочитал в день. Он отображается как

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

в схеме, но это еще не вызвало у меня никаких проблем.

Hive сохраняет значение как пунктирную строку (то есть 20140129), поэтому я преобразую дату в строку, если это даст мне еще боль. Хотя, проходя через два типа данных, это немного глупо.

0

У меня была такая же проблема, самый быстрый способ, чтобы увидеть BIGINT как метку времени Unix, а затем преобразовать его с помощью функции искрового API (метки времени или даты):

from_unixtime(df['time']/1000000000, format='yyyy-MM-dd HH:mm:ss').cast('timestamp') 
Смежные вопросы