Python 为什么不是';Pandas或numpy中是否有合适的datetime.time类型?
我有一个数据集,上面有人们上班的出发时间和到达工作地点的时间。由于人们通常在每个工作日上班,所以显然不需要与数据关联的日期。我每个工作日早上8点上班,每个工作日下午5点回来 类似地,对于学校、办公室等,有许多地方的日期与时间没有多大关系。反之亦然,时间不如日期重要。回到我的问题上来 我的时间编码为历元,转换为日期时间非常简单:Python 为什么不是';Pandas或numpy中是否有合适的datetime.time类型?,python,numpy,pandas,Python,Numpy,Pandas,我有一个数据集,上面有人们上班的出发时间和到达工作地点的时间。由于人们通常在每个工作日上班,所以显然不需要与数据关联的日期。我每个工作日早上8点上班,每个工作日下午5点回来 类似地,对于学校、办公室等,有许多地方的日期与时间没有多大关系。反之亦然,时间不如日期重要。回到我的问题上来 我的时间编码为历元,转换为日期时间非常简单: In [1]: df['time'] = pd.to_datetime(df['time'], unit='m') df['time'].head(3)
In [1]: df['time'] = pd.to_datetime(df['time'], unit='m')
df['time'].head(3)
Out[1]: 0 1970-01-01 06:15:00
1 1970-01-01 06:17:00
2 1970-01-01 08:10:00
Name: time, dtype: datetime64[ns]
但是里面有讨厌的1970-01-01
。我想摆脱它:
In [2]: df['time'].dt.time.head(3)
Out[2]: 0 06:15:00
1 06:17:00
2 08:10:00
Name: time, dtype: object
现在它被转换成对象
,这比拥有1970-01-01
还要麻烦,因为我不能做以下事情:
In [3]: df['time'].dt.time + pd.to_timedelta(df['travel'], unit='m')
Out[3]: ---------------------------------------------------------------------
TypeError Traceback (most recent call last)
< whole bunch of tracebacks. I know what's going on here >
TypeError: ufunc subtract cannot use operands with types dtype('O') and dtype('<m8[ns]')
故事在这本书中重复。有许多示例只包含日期组件,但没有一个示例只包含时间组件
为什么不爱把纯粹的时间储存在一个可操纵的格式中?我是否必须将所有数据转换成Python本机的
datetime.time
类型(这会让我丧命,因为我要处理数十亿行)?我要寻找的是一种仅以可操作格式存储时间组件的方法。一个向这个方向发光的答案将被接受。因为@unutbu没有发布这个问题的答案,只是对它发表了评论,我将发布有效的答案,并接受它作为答案。如果稍后@unutbu发布了答案,我将接受
基本上,正如我在问题中提到的,datetime的日期部分对我来说并不重要。因此,最简单的解决方案是先进行算术运算,然后获得正确的时间:
(df['time'] + pd.to_timedelta(df['travel'], unit='m')).dt.time
因为,@unutbu没有发布这个问题的答案,只是对它发表了评论,我将发布有效的内容,并接受它作为答案。如果稍后@unutbu发布了答案,我将接受 基本上,正如我在问题中提到的,datetime的日期部分对我来说并不重要。因此,最简单的解决方案是先进行算术运算,然后获得正确的时间:
(df['time'] + pd.to_timedelta(df['travel'], unit='m')).dt.time
您需要首先定义您想要的行为。即使转换为Python的本机
datetime.time
也不会有帮助,因为time
plustimedelta
会引发类型错误。对。我忘了那一点。老实说,我不知道如何处理我的情况。谢谢,@unutbu。事实上,很明显:我应该绕过去。因为当一个人去做常规工作时,他不看日期。因此,如果在23:45:00出发,并在30分钟内到达工作场所,那么无论日期如何,此人都会在00:15:00到达。再次感谢@unutbu提醒我在时间对象上执行算术的难题。如果您愿意,那么您可以将您的评论作为答案发布,并建议先进行算术运算,然后根据需要转换为时间对象。这是这个问题的最佳答案,我会接受的。你需要先定义你想要的行为。即使转换为Python的本机datetime.time
也不会有帮助,因为time
plustimedelta
会引发类型错误。对。我忘了那一点。老实说,我不知道如何处理我的情况。谢谢,@unutbu。事实上,很明显:我应该绕过去。因为当一个人去做常规工作时,他不看日期。因此,如果在23:45:00出发,并在30分钟内到达工作场所,那么无论日期如何,此人都会在00:15:00到达。再次感谢@unutbu提醒我在时间对象上执行算术的难题。如果您愿意,那么您可以将您的评论作为答案发布,并建议先进行算术运算,然后根据需要转换为时间对象。这是这个问题的最佳答案,我会接受的。