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

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

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

Я хотел бы преобразовать это NaTs в статическое значение. (Предположим, я импортировал панд как 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

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

Есть идеи?

5
user7969724 20 Сен 2018 в 20:31

2 ответа

Лучший ответ

Это связано со сложным взаимодействием между datetime64, Numpy, 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
4
piRSquared 20 Сен 2018 в 17:50

Если вы находитесь в 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
1
YOBEN_S 20 Сен 2018 в 17:57