【问题标题】:How do you convert a pandas column to time with milisecond?如何将 pandas 列转换为毫秒时间?
【发布时间】:2018-11-01 20:02:24
【问题描述】:

我有一个 pandas 数据框列,pandas 目前认为它是一个对象。它写成“58:42.5”,即分钟、秒和秒的几分之一。我想将其转换为时间类型,这样我就可以减去我必须得到的两个时间列来获得持续时间。

我试过了: merged['started_at'] = pd.to_datetime(merged['started_at'],format='%M:%S').dt.time

但是,这会返回一个错误,指出 .5 未转换。 (ValueError:未转换的数据仍然存在:0.5)。我可以将我的整个两列时间数据转换为正确的格式,以便我最终可以对它们进行数学运算。

我的专栏是这样的:

开始时间,结束时间

58:42.5 , 00:02.3

00:55.5 , 02:13.9

感谢您的帮助。

【问题讨论】:

  • .%f 将转换微秒。
  • 我无法复制您的问题 - 输出 0 00:58:42.500000; 1 00:00:55.500000
  • 这不是问题,请阅读to_datetime doc。很明显,pd.to_datetime(...,format='%M:%S.%f')'4/27/2018 2:55' 打嗝的原因是因为你错过了 m/d/Y 格式='%m/%d/%Y %M:%S.%f'。错误告诉你。
  • @kaecvtionr:不,我在回复之前阅读了整篇帖子三遍,但它并没有在任何地方这么说。当您到达像第 30,000 行这样的行时,没有什么不同的格式。请在您的问题中编辑缺失的信息。

标签: python pandas time series timedelta


【解决方案1】:

您可以在不指定格式的情况下转换为timedelta

x = '58:42.5'

res = pd.to_timedelta('00:'+x)

Timedelta('0 days 00:58:42.500000')

这种转换可以很容易地应用于一个系列:

merged['started_at'] = pd.to_timedelta('00:' + merged['started_at'], errors='coerce')

您的后续操作,例如timedelta 对象之间的差异,应该自然而然地遵循。

【讨论】:

  • @kaecvtionr,抱歉更新了 - 应该是 timedelta,而不是 datetime
  • 所以 timedelta 抛出了一个错误,所以我猜在 60k 行数据中有一些行与这种格式不匹配。有没有办法忽略与格式不匹配的行?
  • @kaecvtionr,当然你可以添加errors='coerce'(查看更新的代码),当无法进行转换时,这将提供NaT。然后您可以使用fillna 填充一些默认的 timedelta 值。
  • 感谢 JPP 的帮助。所以我这样做的原因是我可以计算一系列事件的持续时间。它转换正确,但偶尔会出现逻辑错误,例如结束时间在开始时间之前。所以我想我会写一个遍历数据帧并增加一个小时的for循环,它在下面但我得到一个KeyError:Timedelta('0天00:00:02.300000')。有任何想法吗?感谢您对我在合并['ended_at'] 中的帮助:同时合并['end_at'][i]
  • @kaecvtionr,如果你的数据是干净的,你不应该写一个for 循环。但它似乎不是,所以除非我能看到具体的问题输入,否则很难给出建议。
猜你喜欢
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
  • 2016-03-04
相关资源
最近更新 更多