2024-05-23 15:49:38 发布
网友
我有一个pandas数据框,它有两列,都是对象格式。它们包含年份(4表示2004)和月份。我想减去它们。在
start end 4-oct 12-nov dec-3 11-oct jan-5 16-dec 12-oct 17-apr
我试过了:
但他们没有起作用。在
您的代码有多个问题。在
%y
start
end
repr
object
str
dateutil
des-3
des
DataFrame
Series
综合起来:
def parsedate(s): try: return datetime.strptime(s, '%y-%b') except ValueError: pass try: return datetime.strptime(s, '%b-%y') except ValueError: pass return datetime.now() # <whatever you actually want to do for des-3 here> df.end = df.end.apply(parsedate)
这将起作用,并为您提供Timestamp个值,您可以相互减去这些值来得到Timedelta值。在
Timestamp
Timedelta
当然,它会把des-3变成{},这可能不是你想要的;你必须决定你到底想要什么。在
因为你的格式是如此的混乱,与其试图把它塞进接近标准格式的东西然后处理一堆错误处理,不如用为你的特殊格式设计的代码手动解析它。像这样:
您必须直接使用%y-%b,而不是在repr上:
%y-%b
In [11]: df['end'].apply(lambda x: datetime.strptime(x, "%y-%b")) Out[11]: 0 2012-11-01 1 2011-10-01 2 2016-12-01 3 2017-04-01 Name: end, dtype: datetime64[ns] In [12]: pd.to_datetime(df["end"], format="%y-%b") # alternatively/more efficient Out[12]: 0 2012-11-01 1 2011-10-01 2 2016-12-01 3 2017-04-01 Name: end, dtype: datetime64[ns]
一旦它们都在pandas datetime64系列中,就可以用-来减去它们。在
-
为了修复一位数的年份(在start列中),我将使用regex规范化它们:
然后你可以应用上面的格式。在
您的代码有多个问题。在
%y
,这需要2位数的年份,但有些年份是1位数的。幸运的是,这些只出现在start
中,而您只询问如何解析end
。但是,如果您还想解析start
,或者如果您的实际数据是个位数的年份,那么您需要解决这个问题。在repr
,然后尝试解析字符串repr,而不是仅仅解析字符串。(你的弦已经是弦了。object
是Python中每种类型的基类,包括str
。这就是Pandas在一个系列中使用的方法,它没有一个好的类型,比如int64或datetime64,它只存储原生Python对象,不管它们有什么原生Python类型,比如str
)dateutil
),或者将它们全部预处理为相同的格式,或者编写一个尝试两种格式的函数。在des-3
解析为月份和年份,因为des
不是月份。我不知道你想怎么办。可能使用一个非日期值?在DataFrame
,它只是返回一个新的Series
,你必须把它存储在某处。在综合起来:
这将起作用,并为您提供
Timestamp
个值,您可以相互减去这些值来得到Timedelta
值。在当然,它会把},这可能不是你想要的;你必须决定你到底想要什么。在
des-3
变成{因为你的格式是如此的混乱,与其试图把它塞进接近标准格式的东西然后处理一堆错误处理,不如用为你的特殊格式设计的代码手动解析它。像这样:
^{pr2}$您必须直接使用
%y-%b
,而不是在repr上:一旦它们都在pandas datetime64系列中,就可以用
-
来减去它们。在为了修复一位数的年份(在start列中),我将使用regex规范化它们:
^{pr2}$然后你可以应用上面的格式。在
相关问题 更多 >
编程相关推荐