Невозможно вычесть один столбец даты и времени из другого, вычитание не может использовать операнды с типами dtype ('S1') и dtype ('<M8 [ns]') - PullRequest
1 голос
/ 23 июня 2019

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

df['date_listed'] = pd.to_datetime(df['date_listed'], errors='coerce').dt.floor('d')
df['date_unconditional'] = pd.to_datetime(df['date_unconditional'], errors='coerce').dt.floor('d')

print df['date_listed'][:5]
print df['date_unconditional'][:5]

0   2013-01-01
1   2013-01-01
2   2015-04-08
3   2016-03-24
4   2016-04-27
Name: date_listed, dtype: datetime64[ns]
0   2018-10-15
1   2018-06-12
2   2018-08-28
3   2018-08-29
4   2018-10-29
Name: date_unconditional, dtype: datetime64[ns]

Форматы кажутся правильными, чтобы можно было вычитать, но тогда я получаю эту ошибку:

df['date_listed_to_sale'] = (df['date_sold'] - df['date_listed']).dt.days
print df['date_listed_to_sale'][:5]



TypeErrorTraceback (most recent call last)
<ipython-input-139-85a5efbde0f1> in <module>()
----> 1 df['date_listed_to_sale'] = (df['date_sold'] - df['date_listed']).dt.days
      2 print df['date_listed_to_sale'][:5]

/Users/virt_env/virt1/lib/python2.7/site-packages/pandas/core/ops.pyc in wrapper(left, right)
   1581             rvalues = rvalues.values
   1582 
-> 1583         result = safe_na_op(lvalues, rvalues)
   1584         return construct_result(left, result,
   1585                                 index=left.index, name=res_name, dtype=None)

/Users/virt_env/virt1/lib/python2.7/site-packages/pandas/core/ops.pyc in safe_na_op(lvalues, rvalues)
   1531             if is_object_dtype(lvalues):
   1532                 return libalgos.arrmap_object(lvalues,
-> 1533                                               lambda x: op(x, rvalues))
   1534             raise
   1535 

pandas/_libs/algos.pyx in pandas._libs.algos.arrmap()

/Users/virt_env/virt1/lib/python2.7/site-packages/pandas/core/ops.pyc in <lambda>(x)
   1531             if is_object_dtype(lvalues):
   1532                 return libalgos.arrmap_object(lvalues,
-> 1533                                               lambda x: op(x, rvalues))
   1534             raise
   1535 

TypeError: ufunc subtract cannot use operands with types dtype('S1') and dtype('<M8[ns]')

Я добавил ошибки = 'принудительно', думая, что это может решить проблему, но это не так. Я был бы признателен за помощь с этим.

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

При необходимости изменить первый столбец для вычитания:

df['date_listed_to_sale'] = (df['date_unconditional'] - df['date_listed']).dt.days

Или преобразовать первый столбец date_sold в дату и время:

df['date_sold'] = pd.to_datetime(df['date_sold'], errors='coerce').dt.floor('d')
df['date_listed_to_sale'] = (df['date_sold'] - df['date_listed']).dt.days
0 голосов
/ 24 июня 2019

Я думаю, вам нужно изменить формат, чтобы получить разницу от меток времени.

Пример:

fmt = '%Y-%m-%d'
date_listed = datetime.datetime.strptime('2013-01-01', fmt)
date_unconditional = datetime.datetime.strptime('2018-10-15', fmt)
print("{0} years, {1} months, {2} days" .format((b.year-a.year),(b.month-a.month),(b.day-a.day)))

o / p:

5 years, 0 months, 4 days
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...