在系列操作期间阻止pandas将datetime.timedelta强制转换为numpy.timedelta64?

时间:2014-05-30 18:35:32

标签: python datetime numpy pandas

我正在尝试解析一大堆击键数据,并且遇到了数据类型挑战,试图在按键和释放之间的时间内创建一列。

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

  1. 使用pandas.to_datetime将按下和释放时间从字符串转换为日期时间;这将返回Timestamp数据类型。
  2. 减去按下和释放时间以获得按键的长度,作为datetime.timedelta类型。
  3. (稍后)使用timedelta.total_seconds()方法将秒数作为整数或浮点数进行进一步分析。
  4. 我在第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
    

1 个答案:

答案 0 :(得分:1)

pandas在内部持有timedelta64[ns](作为一个numpy数组)。这是一个很多更高效的表示(基本上是一个整数)用于计算。

您可以转换频率here

你最终想做什么?