python:对非零填充的对象使用strptime()

2024-05-23 15:49:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pandas数据框,它有两列,都是对象格式。它们包含年份(4表示2004)和月份。我想减去它们。在

start     end
4-oct     12-nov
dec-3     11-oct
jan-5     16-dec
12-oct    17-apr

我试过了:

^{pr2}$

但他们没有起作用。在

  1. 如何处理第一列(“%y-%b”和“%b-%y”)中的不同格式和非零填充
  2. 如何将strTime()应用于对象格式?(repr()能否将它们转换为字符串)?在

Tags: 数据对象pandas格式startoctnovapr
2条回答

您的代码有多个问题。在

  • 您使用的是%y,这需要2位数的年份,但有些年份是1位数的。幸运的是,这些只出现在start中,而您只询问如何解析end。但是,如果您还想解析start,或者如果您的实际数据是个位数的年份,那么您需要解决这个问题。在
  • 对字符串调用repr,然后尝试解析字符串repr,而不是仅仅解析字符串。(你的弦已经是弦了。object是Python中每种类型的基类,包括str。这就是Pandas在一个系列中使用的方法,它没有一个好的类型,比如int64或datetime64,它只存储原生Python对象,不管它们有什么原生Python类型,比如str
  • 有些字符串的格式是month-year而不是year-month,因此相同格式的字符串显然不会解析它们。您需要使用某种启发式解析器(可能来自dateutil),或者将它们全部预处理为相同的格式,或者编写一个尝试两种格式的函数。在
  • 你的一个字符串甚至没有有效的月份。不能将des-3解析为月份和年份,因为des不是月份。我不知道你想怎么办。可能使用一个非日期值?在
  • Apply不改变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值。在

当然,它会把des-3变成{},这可能不是你想要的;你必须决定你到底想要什么。在


因为你的格式是如此的混乱,与其试图把它塞进接近标准格式的东西然后处理一堆错误处理,不如用为你的特殊格式设计的代码手动解析它。像这样:

^{pr2}$

您必须直接使用%y-%b,而不是在repr上:

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规范化它们:

^{pr2}$

然后你可以应用上面的格式。在

相关问题 更多 >