我有一个系列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输出中将值转换为datetime
s是对象,而不是时间戳:
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位整数纳秒。
所以你只能找到变通办法。
-
忘记矢量化,直接使用原生Python类型:
df['StartDate'] = df['StartDate'].apply( lambda x: datetime.datetime.strptime(x, '%d/%m/%Y').date())
但对于大型数组来说,这将是次优的,因为Python日期将作为对象列处理。
-
使用numpy datetime64类型,因为numpy接受ns以外的其他单位。不幸的是,您将不得不使用
datetime
或dateutil
进行转换,因为numpy只接受ISO 8601格式(2500-12-01
(:df['StartDate'] = np.datetime64(df['StartDate'].apply( lambda x: np.datetime64(dateutil.parser.parse(x), 'ms'))
在这里,您将再次获得一个对象列,但至少numpy能够以矢量化的方式使用它。