【发布时间】:2014-05-30 18:35:31
【问题描述】:
我正在尝试解析大量击键数据,但遇到了数据类型挑战,试图为按键和释放之间经过的时间创建一列。
我的目标是创建 datetime.timedelta 类型的时间增量列。解析器流程如下:
- 使用 pandas.to_datetime 将新闻和发布时间从字符串转换为日期时间;这将返回 Timestamp 数据类型。
- 减去按下和释放时间得到按键的长度,作为 datetime.timedelta 类型。
- (稍后)使用 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