如何将字符串 - 1year 6mon 转换为数字 1.5?

Posted

技术标签:

【中文标题】如何将字符串 - 1year 6mon 转换为数字 1.5?【英文标题】:How do I convert a string - 1year 6mon to an number 1.5? 【发布时间】:2019-09-03 21:15:46 【问题描述】:

我有 2 列数据以 '1yrs 6mon' 格式存储,其中年份和月份值有多种排列。如何在 python 中将其转换为“总年数”或“总月数”?

我研究了如何做到这一点,但找不到任何建议

预期的输出可能如下所示 1yrs 6mon 可以是 1.5 年或 18 个月 0yrs 7mon 可以是 0.58 年或 7 个月

【问题讨论】:

【参考方案1】:

您可以使用 pandas str.extractall 并进行一些预处理。

s = pd.Series(['1 yr 6 mon', '2 yr 5 mon'])
s

0    1 yr 6 mon
1    2 yr 5 mon
dtype: object

(s.str.extractall(r'(\d+)')[0]
  .unstack()
  .astype(int)
  .set_axis(['yr', 'mon'], axis=1, inplace=False)
  .eval('yr + mon / 12'))

0    1.500000
1    2.416667
dtype: float64

【讨论】:

感谢这一切顺利。我正在尝试使用 pandas split 但那会变成太多的代码行。【参考方案2】:

另一种方法是在系列上使用findallTransformapplydf

In [98]: df
Out[98]:
           A           B
0   1yr 6mon    0yr 7mon
1  3yrs 4mon  2yrs 5mons

定义一个自定义函数以在df 上与apply 一起使用。该函数使用findall 和Transform 来返回年份系列

def to_yrs(s):
    return s.str.findall(r'(\d+)').transform(lambda x: int(x[0]) + int(x[1])/12)

In [99]: df.apply(to_yrs, axis=1)
Out[99]:
          A         B
0  1.500000  0.583333
1  3.333333  2.416667

【讨论】:

以上是关于如何将字符串 - 1year 6mon 转换为数字 1.5?的主要内容,如果未能解决你的问题,请参考以下文章

将以秒为单位的时间间隔转换为更易读的形式

java如何将数字转换为英文

python如何将字符转换为数字

如何将数字中的字节转换为字符串? (数字的字符表示)

如何将数组中的数字字符串转换为数字?

在SQL语句里面如何将字符型转换成数字型?