我有一个dataframe,其中我有一个datetime64[ns]数据类型列,我想应用一个标准,如果日期超过某个年份,它应该采用我提供的固定日期。就像“如果日期超过这个点,最大限度地到这个日期”
我注意到,如果我从任何datetime64[ns]列中选择一个元素,它的类型是pd.Timestamp
,所以我想我应该传递具有相同数据类型的固定日期,以保留整个列的数据类型
但无论我如何传递固定日期(pd.Timestamp或as datetime.datetime),它总是将datetime64列转换为object
数据类型,并以纳秒为单位给出一个历元。
我的问题是,如何使用np.where替换 Dataframe 中的某些值,如果它们满足条件而不改变原始列类型,假设插入的新值与列的类型相同。
举个例子
#generate some data
df=pd.DataFrame({'a':[datetime.now() for i in range(10)]})
#The previous line generated a column named a with datetime64[ns]
# data type if you look at df.dtypes
df.loc[0,'a']=datetime(2050,1,1)
#In the previous line I already substitued a value by directly
# accessing its index, and it does preserve the data type datetime64[ns].
# This is the data
a
0 2050-01-01 00:00:00.000000
1 2023-08-01 17:29:59.011984
2 2023-08-01 17:29:59.011984
3 2023-08-01 17:29:59.011984
4 2023-08-01 17:29:59.011984
5 2023-08-01 17:29:59.011984
6 2023-08-01 17:29:59.011984
7 2023-08-01 17:29:59.011984
8 2023-08-01 17:29:59.011984
9 2023-08-01 17:29:59.011984
#I want to top the date until today's date if the year exceeds the present year
df['a']=np.where(df['a'].dt.year>2023,datetime.now(),df['a'])
#In the previous line, I substitued values but accessing to them
# conditionally with an np.where The result of this
# changes column 'a' data type into integer and puts unix epochs,
# yet the inserted data looks like datetime, this is the output
a
0 2023-08-01 17:31:48.560111
1 1690910999011984000
2 1690910999011984000
3 1690910999011984000
4 1690910999011984000
5 1690910999011984000
6 1690910999011984000
7 1690910999011984000
8 1690910999011984000
9 1690910999011984000
字符串
3条答案
按热度按时间5vf7fwbs1#
字符串
因此,看起来
pandas
已经将datetime
对象转换为np.datetime64[ns]
值。当“提取”时,它显示Timestamp
。提取为numpy数组:
型
探索
where
,无需赋值:型
where
将datatime64
数组和datetime
对象的值组合在一起,生成一个对象dtype数组。型
使用
values
没有什么区别。但是让我们更多地看看datetime `对象:
型
现在,如果我们在两个参数中使用
where
和datatime64
元素:型
现在我们可以将其赋值回dataframe:
型
因此,虽然简单地将
datetime
对象分配给dataframe单元格会强制转换为datetime64
,但要使where
也能工作,我们必须首先进行显式转换。vxf3dgd42#
这个问题的发生是因为你混合了pandas和numpy,它们对日期时间类型有不同的概念。你需要使用pandas来进行过滤:
字符串
lpwwtiir3#
您遇到的问题与使用
np.where
函数时的数据类型一致性有关。当您在单个列中混合不同的数据类型时,Pandas可能会将整个列提升为可以容纳所有值的更通用的数据类型,从而导致观察到的行为。要实现在保留列的数据类型的同时有条件地更新值的目标,可以使用
apply
函数沿着一个自定义函数,该函数根据您的条件返回原始日期时间或固定日期。此方法将确保列的数据类型保持不变。以下是您的操作方法:
字符串
这是输出:
型