【问题标题】:How can I split time data (h/m/s) in Pandas? [closed]如何在 Pandas 中拆分时间数据(h/m/s)? [关闭]
【发布时间】:2021-02-13 00:25:54
【问题描述】:

我有需要转换为列的#h #m #s 格式的数据,但数据不一定包含所有单位。示例:

Case Processing Time (sum)
7m 45s
29s
2m 9s
6h 8s
2h 13m
...

我想要这个格式:

Case Processing Time (sum)
h    m    s
0    7    45
0    0    29
0    2    9
6    0    8
2   13    0

最好的方法是什么?

【问题讨论】:

  • 你能分享你写的产生错误结果的代码吗?
  • 请不要因投反对票而气馁。您的问题实际上非常有趣和困难,只是您没有向我们提供帮助的信息,人们对数据图片而不是可复制代码的反应很糟糕。尝试用纯文本的数据重新询问,并在你已经尝试过的事情上表现出一些努力
  • 作为提示(因为这可能很快就会关闭),您可能需要 re 模块并从数字中进行一些前瞻以找到单位,然后使用 pandas @987654326 @ 声明该函数以在整个列上执行此操作。但是re 签名会很棘手。
  • 问题是我没有写代码,这就是我问方法的原因,不是代码修复,但无论如何。
  • 我编辑了您的问题,以便对敏感者更友好。希望它可以失去一些反对票,因为我认为这实际上是一个有趣的问题。请检查以确保它确实是您想要的。

标签: python pandas numpy dataframe


【解决方案1】:

这是正则表达式的工作。使用pd.Series.extractall,然后将结果展平:

print (df["Case"].str.extractall(r"(?P<H>\d+(?=h))?\s?(?P<M>\d+(?=m))?\s?(?P<S>\d+(?=s))?")
                 .groupby(level=0).first().fillna(0))

   H   M   S
0  0   7  45
1  0   0  29
2  0   2   9
3  6   0   8
4  2  13   0

正则表达式模式解释:

# ? Matches between zero and one times
# \d+ matches a digit between one and unlimited times
# (?=h) Positive lookahead for literal char h
# \s matches any whitespace

【讨论】:

  • 正如我所料,正则表达式签名不适合胆小的人。
猜你喜欢
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
  • 2019-01-01
  • 2022-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多