Numpy Где меняются метки времени / даты и целые числа - PullRequest
0 голосов
/ 20 сентября 2018

Не столько вопрос, но что-то меня озадачивает.

У меня есть столбец дат, который выглядит примерно так:

0              NaT
1       1996-04-01
2       2000-03-01
3              NaT
4              NaT
5              NaT
6              NaT
7              NaT
8              NaT

Я бы хотел преобразовать его в NaTстатическое значение.(Предположим, я импортировал панд как pd и numpy как np).

Если я сделаю:

mydata['mynewdate'] = mydata.mydate.replace(
    np.NaN, pd.datetime(1994,6,30,0,0))

Все хорошо, я получу:

0       1994-06-30
1       1996-04-01
2       2000-03-01
3       1994-06-30
4       1994-06-30
5       1994-06-30
6       1994-06-30
7       1994-06-30
8       1994-06-30

Но еслиЯ делаю:

mydata['mynewdate'] = np.where(
    mydata['mydate'].isnull(), pd.datetime(1994,6,30,0,0),mydata['mydate'])

Я получаю:

0        1994-06-30 00:00:00
1         828316800000000000
2         951868800000000000
3        1994-06-30 00:00:00
4        1994-06-30 00:00:00
5        1994-06-30 00:00:00
6        1994-06-30 00:00:00
7        1994-06-30 00:00:00
8        1994-06-30 00:00:00

Эта операция преобразует исходные ненулевые даты в целые числа.Я подумал, что могут быть перепутаны типы данных, поэтому я сделал это:

mydata['mynewdate'] = np.where(
    mydata['mydate'].isnull(), pd.datetime(1994,6,30,0,0),pd.to_datetime(mydata['mydate']))

И все равно получаю:

0        1994-06-30 00:00:00
1         828316800000000000
2         951868800000000000
3        1994-06-30 00:00:00
4        1994-06-30 00:00:00
5        1994-06-30 00:00:00
6        1994-06-30 00:00:00
7        1994-06-30 00:00:00
8        1994-06-30 00:00:00

Пожалуйста, обратите внимание (и не спрашивайте):Да, у меня есть лучшее решение для замены нулей.Этот вопрос не о замене пустых значений (поскольку заголовок указывает, что это не так), а о том, насколько непонятным является обработка дат.Я спрашиваю, потому что у меня будут более сложные условия для выбора дат для замены в будущем, и я подумал, где будет делать эту работу.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Если вы находитесь в pandas, попробуйте использовать mask/where из pandas

df.mask(df['Date'].isnull(), pd.to_datetime('1994-06-30'))
Out[824]: 
        Date
0 1994-06-30
1 1996-04-01
2 2000-03-01
3 1994-06-30
4 1994-06-30
5 1994-06-30
6 1994-06-30
7 1994-06-30
8 1994-06-30
0 голосов
/ 20 сентября 2018

Это происходит из-за странного взаимодействия между Numpy's datetime64, Pandas 'Timestamp и / или datetime.datetime.Я исправил это, установив значение замены равным numpy.datetime64 с самого начала.

static_date = np.datetime64('1994-06-30')
# static_date = np.datetime64(pd.datetime(1994, 6, 30))

mydata.assign(
    mynewdate=np.where(
        mydata.mydate.isnull(),
        static_date,
        mydata.mydate
    )
)

      mydate  mynewdate
0        NaT 1994-06-30
1 1996-04-01 1996-04-01
2 2000-03-01 2000-03-01
3        NaT 1994-06-30
4        NaT 1994-06-30
5        NaT 1994-06-30
6        NaT 1994-06-30
7        NaT 1994-06-30
8        NaT 1994-06-30
...