【问题标题】:Preventing pandas from coercing datetime.timedelta to numpy.timedelta64 during Series operations?防止熊猫在系列操作期间将 datetime.timedelta 强制为 numpy.timedelta64?
【发布时间】:2014-05-30 18:35:31
【问题描述】:

我正在尝试解析大量击键数据,但遇到了数据类型挑战,试图为按键和释放之间经过的时间创建一列。

我的目标是创建 datetime.timedelta 类型的时间增量列。解析器流程如下:

  1. 使用 pandas.to_datetime 将新闻和发布时间从字符串转换为日期时间;这将返回 Timestamp 数据类型。
  2. 减去按下和释放时间得到按键的长度,作为 datetime.timedelta 类型。
  3. (稍后)使用 timedelta.total_seconds() 方法将秒数作为整数或浮点数获取,以便进一步分析。

我在第 2 步遇到了一个问题——当我在解释器中减去两个单独的时间戳时,我得到一个 datetime.timedelta(这是我想要的),当我减去两个时间戳系列时,得到的系列是 numpy.timedelta64 类型!有谁知道为什么 pandas 会为系列减法返回此数据类型,而我却得到一个 datetime.timedelta 用于单个减法?

非常感谢!

我在下面粘贴了我的调试会话,我首先在单行上手动进行转换,然后使用系列范围的运算符进行相同的转换。

手动:

In : touchtime = task_dataframe['TouchTime'].ix[0]
In : touchtime
Out[1]: u'07:01:00.891'
In : releasetime = task_dataframe['ReleaseTime'].ix[0]
In : releasetime
Out[1]: u'07:01:00.950'
In : import pandas as pd
In : touchtime = pd.to_datetime(touchtime)
In : touchtime
Out[1]: Timestamp('2014-05-30 07:01:00.891000', tz=None)
In : releasetime = pd.to_datetime(releasetime)
In : releasetime
Out[1]: Timestamp('2014-05-30 07:01:00.950000', tz=None)
In : holdtime = releasetime - touchtime
In : holdtime
Out[1]: datetime.timedelta(0, 0, 59000)

全系列:

In : task_dataframe['TouchTime'] = task_dataframe['TouchTime'].map(lambda x: pd.to_datetime(x))
In : task_dataframe['ReleaseTime'] = task_dataframe['ReleaseTime'].map(lambda x: pd.to_datetime(x))
In : releasetime2 = task_dataframe['ReleaseTime'].ix[0]
In : releasetime2
Out[1]: Timestamp('2014-05-30 07:01:00.950000', tz=None) # Same output as above
In : releasetime == releasetime2
Out[1]: True # Showing equivalence
In : task_dataframe['HoldTime'] = task_dataframe['ReleaseTime'] - task_dataframe['TouchTime']
In : holdtime2 = task_dataframe['HoldTime'].ix[0]
In : holdtime2
Out[1]: numpy.timedelta64(59000000,'ns')
In : holdtime == holdtime2
Out[1]: False # Non-equivalent

【问题讨论】:

  • 您可以通过numpy.int64(task_dataframe['HoldTime']) 获取您的整数吗?

标签: python datetime numpy pandas


【解决方案1】:

pandas 在内部保存timedelta64[ns](作为一个 numpy 数组)。这是一种更有效的计算表示(因为它基本上是一个整数)。

您可以转换频率here

你最终想要做什么?

【讨论】:

  • 我们将对按键的长度(以及按键之间的时间)进行一些统计分析,检测和删除异常值(可疑的长或短按键),将印刷机的长度转换为其他值(通过将某些功能映射到整个系列),等等。
  • 好的,所以timedelta64[ns]系列在这方面效率更高。
猜你喜欢
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 2018-07-05
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
相关资源
最近更新 更多