2016-04-14 2 views
3

Обновлено сообщение:Почему панда превращающий DateTimes плавать в агрегатной функции

Я хотел бы знать, почему панда трансформируется в datetime столбце в float один.

В приведенном ниже коде представлен вопрос, который у меня есть.

df = pd.DataFrame(pd.date_range("2012-01-01", periods=12).values.reshape(3,4), columns=list('abcd')) 

print "Original:", {col: df[col].dtype for col in df.columns} 

df['c'].loc[1] = pd.NaT 
df['d'].loc[1] = pd.NaT 

df['ab'] = df[['a','b']].min(1) 
df['cd'] = df[['c','d']].min(1) 

print "New:", {col: df[col].dtype for col in df.columns} 

Это печатает:

Original: {'a': dtype('<M8[ns]'), 'c': dtype('<M8[ns]'), 'b': dtype('<M8[ns]'), 'd': dtype('<M8[ns]')} 
New: {'a': dtype('<M8[ns]'), 'c': dtype('<M8[ns]'), 'b': dtype('<M8[ns]'), 'd': dtype('<M8[ns]'), 'cd': dtype('float64'), 'ab': dtype('<M8[ns]')} 

Обратите внимание, что столбец ab имеет тип dtype('<M8[ns]') но cd имеет тип dtype('float64').

Почему Панда меняет тип?

Оригинал сообщение:

Я бег очень простой код:

x['new1'] = x[['startDate1','stopDate1']].min(1) 
x['new2'] = x[['startDate2','stopDate2']].min(1) 

где х выглядит примерно так:

ID   startDate1 stopDate1 startDate2 stopDate2 

0   2000-01-01 2000-03-05 2005-01-01 2006-03-05 
       ...   ...   ...   ... 
40053  1997-01-01 2011-03-05 2012-01-01 2012-03-05 

Запуск x[colName].dtype на все исходные столбцы возвращает dtype('<M8[ns]').

Однако x['new1'].dtype не соответствует x['new2'].dtype, где первый является dtype('<M8[ns]') но последний dtype('float64').

Я исправил это с помощью этой строки, но я хочу знать, почему это происходит, поскольку для меня это мало смысла.

x['new2'] = pd.to_datetime(x[['startDate2','stopDate2']].min(1)) 

Есть много строк, поэтому я не могу пройти через все из них. Что это означает в отношении столбцов startDate2 и stopDate2?

Обновление Оригинальное сообщение: Единственное различие, которое я нашел между столбцами в том, что stopDate2 имеет, по меньшей мере, один ряд с NaT. Удаление NaT s устраняет проблему, но я не могу воспроизвести ее с помощью фиктивных данных.

+0

могли бы вы добавить код, который создает массив x, чтобы воспроизвести проблему? –

+0

Я попытался упростить его (фактический код очень длинный) - это импорт CSV, который обрабатывается много раз. – TimY

+0

Какую версию панд вы используете? Я не могу воспроизвести это с 0.16-0.18 – joris

ответ

0

Как сказано в комментариях, это, вероятно, ошибка, из-за наличия NaN, в случае, если вы хотели бы иметь работу вокруг, вы можете сделать:

df[["c", "d"]].min(axis=1).astype("<M8[ns]") 
0

Похожие проблемы. Использование панд 0.18.1.Смотрите, что df.timestamp имеет различные типы в двух различных сценариях:

df = pd.DataFrame(np.random.rand(250).reshape(50,5), 
         index=pd.date_range('1/1/2016', periods=50, freq='H'), 
         columns=list('ABCDE')) 
df['timestamp'] = df.index 

print(df.timestamp.resample('30min',label='right').last().head(3)) 
print('==========') 
print(df.timestamp.resample('2H',label='right').last().head(3)) 

выход:

2016-01-01 00:30:00 1.451606e+18 
2016-01-01 01:00:00    NaN 
2016-01-01 01:30:00 1.451610e+18 
Freq: 30T, Name: timestamp, dtype: float64 
========== 
2016-01-01 02:00:00 2016-01-01 01:00:00 
2016-01-01 04:00:00 2016-01-01 03:00:00 
2016-01-01 06:00:00 2016-01-01 05:00:00 
Freq: 2H, Name: timestamp, dtype: datetime64[ns] 

Также найдено отчет об ошибке, связанной с этим вопросом: https://github.com/pydata/pandas/issues/12941

Смежные вопросы