将 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
与其说是一个问题,不如说是一些让我困惑的事情。
我有一列日期看起来像这样:
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