【问题标题】:Numpy Where Changing Timestamps/Datetime to IntegersNumpy 将时间戳/日期时间更改为整数
【发布时间】:2018-09-21 01:57:40
【问题描述】:

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

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

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

此操作将原始的非空日期转换为整数。我认为可能存在数据类型混淆,所以我这样做了:

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。我问是因为我将来会有更复杂的条件来选择要替换的日期,并认为 numpy 将在哪里完成这项工作。

有什么想法吗?

【问题讨论】:

    标签: python pandas numpy datetime where


    【解决方案1】:

    这是由于 Numpy 的 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
    

    【讨论】:

    • 酷。我想它是这样的。我还没有找到正确的转换什么来让它工作的东西。直截了当: mydata['mynewdate'] = np.where(mydata['mydate'].isnull(), np.datetime64('1994-06-30'),mydata['mydate']) 也可以。
    • @Vaishali:请注意我帖子末尾的评论:“请注意(不要问):是的,我有一个更好的解决方案来替换空值。这个问题不是关于替换nulls(因为标题表明它不是)但是 numpy where 是如何处理日期的。我问是因为我将来会有更复杂的条件来选择要替换的日期,并认为 numpy where 可以完成这项工作。”
    【解决方案2】:

    如果您在pandas,请尝试使用来自pandasmask/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
    

    【讨论】:

    • 谢谢。但我就像我说的那样,我之所以问是因为我将来会有一些相当复杂的条件要测试,而 mask 可能不会削减它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 2022-09-28
    • 1970-01-01
    相关资源
    最近更新 更多