Numpy将时间戳/日期时间更改为整数的位置

Bri*_*sky 5 python datetime numpy where pandas

这不是一个问题,而是令我困惑的事情.

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

0              NaT
1       1996-04-01
2       2000-03-01
3              NaT
4              NaT
5              NaT
6              NaT
7              NaT
8              NaT
Run Code Online (Sandbox Code Playgroud)

我想将NaT转换为静态值.(假设我将pandas导入为pd,将numpy导入为np).

如果我做:

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

一切都很好,我得到:

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
Run Code Online (Sandbox Code Playgroud)

但如果我这样做:

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

我明白了:

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
Run Code Online (Sandbox Code Playgroud)

此操作将原始的非null日期转换为整数.我以为可能会混淆数据类型,所以我这样做了:

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

仍然得到:

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
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

piR*_*red 9

这是由于 Numpy datetime64、 PandasTimestamp和/或之间的不稳定交互造成的datetime.datetimenumpy.datetime64我通过从一开始就将替换值设置为 a 来修复它。

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
Run Code Online (Sandbox Code Playgroud)