有可能更改熊猫的最大时间戳吗



我有一个系列StartDate,它在数据帧中保存日期

df = pd.DataFrame({'StartDate':['1/1/2100','1/12/2500']})

它与熊猫Timestamp('2262-04-11 23:47:16.854775807')的最大时间戳重叠

例如:'1/1/2100'

有没有办法将最大时间戳更改为更大的值?

通过使用df['StartDate'] = pd.to_datetime(df['StartDate']).dt.date,我得到的是'Nat',而不是'1/1/2100'

是否可以更改panda中的最大时间戳?

我不这么认为。


您可以将日期转换为每日时段:

df = pd.DataFrame({'StartDate':['1/1/2100','1/12/2500']})
df['StartDate'] = df['StartDate'].apply(lambda x: pd.Period(x, freq="D"))
print (df)
StartDate
0  2100-01-01
1  2500-01-12

不幸的是,如果在纯python输出中将值转换为datetimes是对象,而不是时间戳:

import datetime as dt
df['StartDate'] = df['StartDate'].apply(lambda x: dt.datetime.strptime(x,"%m/%d/%Y"))
print (df)
StartDate
0  2100-01-01 00:00:00
1  2500-01-12 00:00:00
print (df.dtypes)
StartDate    object
dtype: object

EDIT:如果没有丢失值,则使用errors='coerce'参数作为NaT的不可能转换日期时间,并在fillna中用最大Timestamp:替换它们

df = pd.DataFrame({'StartDate':['1/1/2100','1/12/2500']})
df['StartDate'] = pd.to_datetime(df['StartDate'], errors='coerce').fillna(pd.Timestamp.max)
print (df)
StartDate
0 2100-01-01 00:00:00.000000000
1 2262-04-11 23:47:16.854775807

如果可能,输入数据中的NaN是必要的,则通过掩码设置值:

df = pd.DataFrame({'StartDate':['1/1/2100','1/12/2500', np.nan]})
m1 = df['StartDate'].notna()
s = pd.to_datetime(df['StartDate'], errors='coerce')
m2 = s.isna()
df['StartDate'] = s.mask(m1 & m2, pd.Timestamp.max)
print (df)
StartDate
0 2100-01-01 00:00:00.000000000
1 2262-04-11 23:47:16.854775807
2                           NaT

这不是直接可能的,因为Pandas内部使用numpydatatime64[ns]类型,不同地说,自大纪元(1970年1月1日(以来,64位整数纳秒。

所以你只能找到变通办法。

  1. 忘记矢量化,直接使用原生Python类型:

    df['StartDate'] = df['StartDate'].apply(
    lambda x: datetime.datetime.strptime(x, '%d/%m/%Y').date())
    

    但对于大型数组来说,这将是次优的,因为Python日期将作为对象列处理。

  2. 使用numpy datetime64类型,因为numpy接受ns以外的其他单位。不幸的是,您将不得不使用datetimedateutil进行转换,因为numpy只接受ISO 8601格式(2500-12-01(:

    df['StartDate'] = np.datetime64(df['StartDate'].apply(
    lambda x: np.datetime64(dateutil.parser.parse(x), 'ms'))
    

    在这里,您将再次获得一个对象列,但至少numpy能够以矢量化的方式使用它。

最新更新