将 Timestamps/Datetime 更改为整数的 Numpy

Numpy Where Changing Timestamps/Datetime to Integers

与其说是一个问题,不如说是一些让我困惑的事情。

我有一列日期看起来像这样:

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

我想将其 NaT 转换为静态值。 (假设我将 pandas 导入为 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

此操作将原始 non-null 日期转换为整数。我认为可能会有 mix-up 种数据类型,所以我这样做了:

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

请注意(不要问):是的,我有一个更好的替换空值的解决方案。这个问题不是关于替换空值(正如标题表明它不是)而是如何处理日期的 numpy。我问是因为我将有更复杂的条件来替换 select 日期,并且认为 numpy 在哪里可以完成这项工作。

有什么想法吗?

这是由于 Numpy 的 datetime64、Pandas' Timestamp、and/or 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

如果您在 pandas 尝试使用 pandas

中的 mask/where
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