Извлечь год из столбца pandas datetime в виде числового c значения с NaN для пустых ячеек вместо NaT - PullRequest
0 голосов
/ 26 мая 2020

Я хочу извлечь год из столбца datetime в новый столбец «yyyy» И я хочу, чтобы отсутствующие значения (NaT) отображались как «NaN», поэтому необходимо изменить тип datetime-dtype нового столбца Думаю, но я застрял ..

Начальный df:

        Date  ID
0 2016-01-01  12
1 2015-01-01  96
2        NaT  20
3 2018-01-01  73
4 2017-01-01  84
5        NaT  26
6 2013-01-01  87
7 2016-01-01  64
8 2019-01-01  11
9 2014-01-01  34

Желаемый df:

        Date  ID  yyyy
0 2016-01-01  12  2016
1 2015-01-01  96  2015
2        NaT  20   NaN
3 2018-01-01  73  2018
4 2017-01-01  84  2017
5        NaT  26   NaN
6 2013-01-01  87  2013
7 2016-01-01  64  2016
8 2019-01-01  11  2019
9 2014-01-01  34  2014

Код:

import pandas as pd

import numpy as np



# example df
df = pd.DataFrame({"ID": [12,96,20,73,84,26,87,64,11,34],
    
                 "Date": ['2016-01-01', '2015-01-01', np.nan, '2018-01-01', '2017-01-01', np.nan, '2013-01-01', '2016-01-01', '2019-01-01', '2014-01-01']})



df.ID = pd.to_numeric(df.ID)

df.Date = pd.to_datetime(df.Date)
print(df)

#extraction of year from date
df['yyyy'] = pd.to_datetime(df.Date).dt.strftime('%Y')



#Try to set NaT to NaN or datetime to numeric, PROBLEM: empty cells keep 'NaT'
df.loc[(df['yyyy'].isna()), 'yyyy'] = np.nan

   #(try1)
df.yyyy = df.Date.astype(float)
                #(try2)
df.yyyy = pd.to_numeric(df.Date)
               #(try3)

print(df)


Ответы [ 2 ]

1 голос
/ 26 мая 2020

Используйте Series.dt.year с преобразованием в целые числа с помощью Int64:

df.Date = pd.to_datetime(df.Date)

df['yyyy'] = df.Date.dt.year.astype('Int64')
print (df)
   ID       Date  yyyy
0  12 2016-01-01  2016
1  96 2015-01-01  2015
2  20        NaT  <NA>
3  73 2018-01-01  2018
4  84 2017-01-01  2017
5  26        NaT  <NA>
6  87 2013-01-01  2013
7  64 2016-01-01  2016
8  11 2019-01-01  2019
9  34 2014-01-01  2014

Без преобразования чисел с плавающей запятой в целые числа:

df['yyyy'] = df.Date.dt.year
print (df)
   ID       Date    yyyy
0  12 2016-01-01  2016.0
1  96 2015-01-01  2015.0
2  20        NaT     NaN
3  73 2018-01-01  2018.0
4  84 2017-01-01  2017.0
5  26        NaT     NaN
6  87 2013-01-01  2013.0
7  64 2016-01-01  2016.0
8  11 2019-01-01  2019.0
9  34 2014-01-01  2014.0

Ваше решение преобразует NaT в строки NaT, поэтому можно использовать replace. Кстати, в последних версиях pandas replace не нужно, работает корректно.

df['yyyy'] = pd.to_datetime(df.Date).dt.strftime('%Y').replace('NaT', np.nan)
1 голос
/ 26 мая 2020

Не так ли:

df['yyyy'] = df.Date.dt.year

Вывод:

        Date  ID    yyyy
0 2016-01-01  12  2016.0
1 2015-01-01  96  2015.0
2        NaT  20     NaN
3 2018-01-01  73  2018.0
4 2017-01-01  84  2017.0
5        NaT  26     NaN
6 2013-01-01  87  2013.0
7 2016-01-01  64  2016.0
8 2019-01-01  11  2019.0
9 2014-01-01  34  2014.0

Для pandas 0.24.2+ вы можете использовать тип данных Int64 для целых чисел, допускающих значение NULL:

df['yyyy'] = df.Date.dt.year.astype('Int64')

, что дает:

        Date  ID  yyyy
0 2016-01-01  12  2016
1 2015-01-01  96  2015
2        NaT  20  <NA>
3 2018-01-01  73  2018
4 2017-01-01  84  2017
5        NaT  26  <NA>
6 2013-01-01  87  2013
7 2016-01-01  64  2016
8 2019-01-01  11  2019
9 2014-01-01  34  2014
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...