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

У меня есть DataFrame, который выглядит так -

  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

Ответы [ 3 ]

2 голосов
/ 22 апреля 2019

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

код:

df_new['difference'] = df_new['time'].dt.total_seconds().div(60).astype(float)
1 голос
/ 22 апреля 2019

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

.round(2) округляет значения до 2 десятичных знаков, но я бы посоветовал округлить до 2 десятичных после того, как вы получили среднее значение. Обратите внимание, что панды будут отображать до 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
0 голосов
/ 22 апреля 2019

Вот в пути и с помощью 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
...