Получить число с плавающей запятой вместо целого числа после преобразования дня / времени в месяцы с помощью библиотеки Pandas

#python #pandas #math #statistics #data-science

#python #pandas #математика #Статистика #наука о данных

Вопрос:

У меня есть фрейм данных, который выглядит следующим образом —

   37 days 19:07:00
  69 days 02:32:00
  44 days 00:38:00
  14 days 07:30:00
  14 days 23:03:00
  41 days 16:41:00
  

Я хочу преобразовать это время в месяцы, для которых я использую этот код —

 df_new['difference'] = df_new['time'].dt.total_seconds().div(60).astype(int)
  

Это дает мне результаты, но в течение дней менее 30 он возвращает мне 0 месяцев, поэтому я хочу десятичное значение этого столбца вместо абсолютного числа. Как я могу это сделать? Моя конечная цель — найти среднее значение этого столбца.

Мой текущий вывод выглядит как столбец один, а желаемый результат находится в столбце 2.

 Current 
1
2
2
5
0
0

Desired 
1
2
2
5
0.2
0.5
  

Ответ №1:

Измените astype(int) на astype(float)

код:

 df_new['difference'] = df_new['time'].dt.total_seconds().div(60).astype(float)
  

Комментарии:

1. Это сработало. Спасибо. Как я могу ограничить десятичные дроби до 2 цифр после десятичной дроби?

2. Эй, @bella, попробуй метод round(). Код: round(df_new[‘разница’], 2) . Это означает, что вам нужно только 2 десятичных числа.

3. @Isabelle если мое решение сработало для вас, пожалуйста, отметьте мой ответ символом зеленой галочки, который вы можете найти в левой части ответа (он будет зеленым после щелчка). Спасибо.

Ответ №2:

.astype(int) вернет целое число, исходя из того, что вам нужно, вы должны использовать .astype(float)

.round(2) значения будут округлены до 2 знаков после запятой, но я бы посоветовал округлить до 2 знаков после запятой после того, как вы получили среднее значение. Обратите внимание, что pandas будет отображать только до 6 знаков после запятой при печати выходных данных. Однако будьте уверены, что при вызове значения будет соблюдена указанная вами точность.

 >>> df = pd.DataFrame([[1,2],[3,4]], columns=['a','b'])
>>> df['c'] = df['a'].div(7).astype(float)
>>> df['d'] = df['a'].div(7).astype(float).round(2)
>>> df['e'] = df['a'].div(7).astype(float).round(7)   # only 6 d.p. displayed
>>> df['f'] = df['a'].div(7).astype(float).round(10)  # only 6 d.p. displayed (uh-oh!)
  

Но когда вы «вызываете» значения, вы увидите указанную точность:

 >>> df['d'][0]
0.1428571
>>> df['e'][0]
0.1428571429
  

Комментарии:

1. Это сработало. Спасибо. Как я могу ограничить десятичные дроби до 2 цифр после десятичной дроби?

2. Что касается ссылки ниже, все, что вам нужно сделать, это добавить .round(2) , но я предложу сначала усреднить значения перед округлением. pandas.pydata.org/pandas-docs/stable/reference/api /…

Ответ №3:

Вот способ и использование np.where

 news=pd.to_timedelta(s).dt.total_seconds().div(30*60*60*24).round(1)
news=pd.Series(np.where(news>1.0,news.round(0),news.round(1))).astype(object)
news
Out[919]: 
0      1
1      2
2      2
3    0.5
4    0.5
5      1
dtype: object