La creación de pandas.Series () usando columnas de DataFrame devuelve entradas de datos NaN

Estoy intentando convertir un dataframe en una serie usando un código que, simplificado, se ve así:

dates = ['2016-1-{}'.format(i)for i in range(1,21)] values = [i for i in range(20)] data = {'Date': dates, 'Value': values} df = pd.DataFrame(data) df['Date'] = pd.to_datetime(df['Date']) ts = pd.Series(df['Value'], index=df['Date']) print(ts) 

Sin embargo, la salida de impresión se ve así:

 Date 2016-01-01 NaN 2016-01-02 NaN 2016-01-03 NaN 2016-01-04 NaN 2016-01-05 NaN 2016-01-06 NaN 2016-01-07 NaN 2016-01-08 NaN 2016-01-09 NaN 2016-01-10 NaN 2016-01-11 NaN 2016-01-12 NaN 2016-01-13 NaN 2016-01-14 NaN 2016-01-15 NaN 2016-01-16 NaN 2016-01-17 NaN 2016-01-18 NaN 2016-01-19 NaN 2016-01-20 NaN Name: Value, dtype: float64 

¿De dónde viene NaN ? ¿Una vista en un objeto DataFrame no es una entrada válida para la clase Series ?

He encontrado la función to_series para pd.Index objetos, ¿hay algo similar para DataFrame s?

Creo que puedes usar values , convierte la columna Value a matriz:

 ts = pd.Series(df['Value'].values, index=df['Date']) 
 import pandas as pd import numpy as np import io dates = ['2016-1-{}'.format(i)for i in range(1,21)] values = [i for i in range(20)] data = {'Date': dates, 'Value': values} df = pd.DataFrame(data) df['Date'] = pd.to_datetime(df['Date']) print df['Value'].values [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19] ts = pd.Series(df['Value'].values, index=df['Date']) 
 print(ts) Date 2016-01-01 0 2016-01-02 1 2016-01-03 2 2016-01-04 3 2016-01-05 4 2016-01-06 5 2016-01-07 6 2016-01-08 7 2016-01-09 8 2016-01-10 9 2016-01-11 10 2016-01-12 11 2016-01-13 12 2016-01-14 13 2016-01-15 14 2016-01-16 15 2016-01-17 16 2016-01-18 17 2016-01-19 18 2016-01-20 19 dtype: int64 

O puedes usar:

 ts1 = pd.Series(data=values, index=pd.to_datetime(dates)) print(ts1) 2016-01-01 0 2016-01-02 1 2016-01-03 2 2016-01-04 3 2016-01-05 4 2016-01-06 5 2016-01-07 6 2016-01-08 7 2016-01-09 8 2016-01-10 9 2016-01-11 10 2016-01-12 11 2016-01-13 12 2016-01-14 13 2016-01-15 14 2016-01-16 15 2016-01-17 16 2016-01-18 17 2016-01-19 18 2016-01-20 19 dtype: int64 

Gracias, @ajcr, por una mejor explicación de por qué obtienes NaN :

Cuando DataFrame columna Series o DataFrame de pd.Series a pd.Series , la pd.Series utilizando el index que especifique. Dado que su columna DataFrame tiene un index entero (no un date index ), obtiene muchos valores faltantes.

Si solo está buscando una para crear series con esos valores, también podría haberlo hecho:

  pd.Series( [i for i in range(20)], pd.date_range('2016-01-02', periods=20, freq='D')) 

Usted puede simplemente hacer:

 s = df.set_index('Date') 

Que ahora es un dataframe de una columna.

Si realmente lo quieres como una serie:

 s = df.set_index('Date').Value 

por cierto, NaN es el número de Numpy.

Usando tu método, podrías usar:

 ts = pd.Series(df['Value'].values, name='Value', index=df['Date']) 

La razón por la que recibe los NaN es que no está proporcionando los datos en el formato correcto. Estás pasando una serie a una serie.