Итерация через столбцы datetime64 в pandas dataframe [duplicate]

Увеличение размера кучи не является «исправлением», это «штукатурка», 100% временная. Он снова рухнет в другом месте. Чтобы избежать этих проблем, напишите код высокой производительности.

  1. По возможности используйте локальные переменные.
  2. Убедитесь, что вы выбрали правильный объект (EX: выбор между String, StringBuffer и StringBuilder )
  3. Используйте хорошую систему кода для вашей программы (EX: Использование статических переменных VS нестатические переменные)
  4. Другие материалы, которые могли бы работать с вашим кодом.
  5. Попробуйте перемещаться с помощью multy THREADING
10
задан jezrael 15 June 2016 в 16:52
поделиться

3 ответа

Вы можете разделить столбец dtype timedelta на np.timedelta64(1, 'D'), но вывод не int, но float, поскольку значения NaN :

df_test['Difference'] = df_test['Difference'] / np.timedelta64(1, 'D')
print (df_test)
  First_Date Second Date  Difference
0 2016-02-09  2015-11-19        82.0
1 2016-01-06  2015-11-30        37.0
2        NaT  2015-12-04         NaN
3 2016-01-06  2015-12-08        29.0
4        NaT  2015-12-09         NaN
5 2016-01-07  2015-12-11        27.0
6        NaT  2015-12-12         NaN
7        NaT  2015-12-14         NaN
8 2016-01-06  2015-12-14        23.0
9        NaT  2015-12-15         NaN

Преобразование частоты .

13
ответ дан jezrael 19 August 2018 в 02:44
поделиться

Вы можете использовать модуль datetime, чтобы помочь здесь. Кроме того, в качестве побочного примечания, вычитание простой даты должно работать следующим образом:

import datetime as dt
import numpy as np
import pandas as pd

#Assume we have df_test:
In [222]: df_test
Out[222]: 
   first_date second_date
0  2016-01-31  2015-11-19
1  2016-02-29  2015-11-20
2  2016-03-31  2015-11-21
3  2016-04-30  2015-11-22
4  2016-05-31  2015-11-23
5  2016-06-30  2015-11-24
6         NaT  2015-11-25
7         NaT  2015-11-26
8  2016-01-31  2015-11-27
9         NaT  2015-11-28
10        NaT  2015-11-29
11        NaT  2015-11-30
12 2016-04-30  2015-12-01
13        NaT  2015-12-02
14        NaT  2015-12-03
15 2016-04-30  2015-12-04
16        NaT  2015-12-05
17        NaT  2015-12-06

In [223]: df_test['Difference'] = df_test['first_date'] - df_test['second_date'] 

In [224]: df_test
Out[224]: 
   first_date second_date  Difference
0  2016-01-31  2015-11-19     73 days
1  2016-02-29  2015-11-20    101 days
2  2016-03-31  2015-11-21    131 days
3  2016-04-30  2015-11-22    160 days
4  2016-05-31  2015-11-23    190 days
5  2016-06-30  2015-11-24    219 days
6         NaT  2015-11-25         NaT
7         NaT  2015-11-26         NaT
8  2016-01-31  2015-11-27     65 days
9         NaT  2015-11-28         NaT
10        NaT  2015-11-29         NaT
11        NaT  2015-11-30         NaT
12 2016-04-30  2015-12-01    151 days
13        NaT  2015-12-02         NaT
14        NaT  2015-12-03         NaT
15 2016-04-30  2015-12-04    148 days
16        NaT  2015-12-05         NaT
17        NaT  2015-12-06         NaT

Теперь измените тип на datetime.timedelta, а затем используйте метод .days для действительных объектов timedelta.

In [226]: df_test['Diffference'] = df_test['Difference'].astype(dt.timedelta).map(lambda x: np.nan if pd.isnull(x) else x.days)

In [227]: df_test
Out[227]: 
   first_date second_date  Difference  Diffference
0  2016-01-31  2015-11-19     73 days           73
1  2016-02-29  2015-11-20    101 days          101
2  2016-03-31  2015-11-21    131 days          131
3  2016-04-30  2015-11-22    160 days          160
4  2016-05-31  2015-11-23    190 days          190
5  2016-06-30  2015-11-24    219 days          219
6         NaT  2015-11-25         NaT          NaN
7         NaT  2015-11-26         NaT          NaN
8  2016-01-31  2015-11-27     65 days           65
9         NaT  2015-11-28         NaT          NaN
10        NaT  2015-11-29         NaT          NaN
11        NaT  2015-11-30         NaT          NaN
12 2016-04-30  2015-12-01    151 days          151
13        NaT  2015-12-02         NaT          NaN
14        NaT  2015-12-03         NaT          NaN
15 2016-04-30  2015-12-04    148 days          148
16        NaT  2015-12-05         NaT          NaN
17        NaT  2015-12-06         NaT          NaN

Надеюсь, что это поможет.

8
ответ дан clocker 19 August 2018 в 02:44
поделиться
  • 1
    Да, это одно возможное решение, но я думаю, что это не рекомендуется, потому что вывод столбца Diffference равен object, а следующая обработка (добавление, вычитание ...) невозможна. – jezrael 16 June 2016 в 11:27
  • 2
    @jesrael, есть и другие способы сделать, например, ваше решение. Однако добавление / вычитание не является проблемой при смешивании NaN с типами int в столбце. При необходимости они будут автоматически загружаться в поплавковые операции. – clocker 16 June 2016 в 15:59
  • 3
    Я не проверю его, спасибо за комментарий. – jezrael 16 June 2016 в 16:00

Как насчет:

df_test['Difference'] = (df_test['First_Date'] - df_test['Second Date']).dt.days

Это будет возвращать разницу как int.

7
ответ дан Prayson Daniel 19 August 2018 в 02:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: