怎么将python时间段(Timedelta)转化为int或float数值形式! 急。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么将python时间段(Timedelta)转化为int或float数值形式! 急。相关的知识,希望对你有一定的参考价值。

比如我两个时间2014-6-30和2013-12-10相减得到225 days 12:00:00,怎么将这个Timedelta转化为按月份计算的可以数值形式(int或float),比如8.5,转化成可以进行聚类计算的数值。

1、打开visio studio 2015,在文件中打开新建项目,新建一个Python应用程序,并修改程序的名称为int2date。

2、在生成的int2date.py文件中加入以下代码:from dateutil.parser import parsea=20181229,

b=str(a),c=parse(b),print(c)。

3、运行结果如下。

4、打开IDLE,并新建一个文件,在新建文件中输入以下代码:from dateutil.parser import parse。a=20181229b=str(a),c=parse(b),print(c)。

5、点击run model会出现以下对话框,选择确定,并填入合适的文件名。

6、运行结果如下。

参考技术A 月是一个没有定数的单位,一个月是28天,29天,30天,还是31天?。
没有正式场合用月为单位统计。
不是不能转,只是没有标准规则转。
你可以先定个私家规则,规定你的“统计月”的天数,除一下就可以得出。追问

对图中DataFrame的第一列和第二列的时间戳相减怎么能得到按月份的数值,按每月30天估计也可以,无所谓。比如8.2个月,15.5个月。重要的是将时间段的type转化为数值的type,int或float均可,以便于整个DataFrame可以进行标准化处理后,利用Kmeans算法进行聚类分析。225 days 12:00:00,这种Timedelta格式是不能进行欧氏距离计算的。

追答

Timedelta对象是可以用于加减乘除等数值计算的,也专门用于表示时间段。
如果转换成8.2个月会引起数值不精确,多此一举也容易引起统计错误。
问题不在Timedelta,而你是对pandas的相关操作的不熟悉。
没有环境只看你这半张图的情况,我只能说你先成共转换成TimeDelta再去做下一步,错误在你的具体代码上,不是在Timedelta功能不足.

追问

225 days 12:00:00 ,83 days 07:00:00这样的Timedelta格式也可以进行标准化处理吗?Timedelta列减去均值,再除标准差。可以吗?

追答>>> import datetime
>>> a=datetime.timedelta(days=225,hours=12) #你说的225天12小时
>>> b=datetime.timedelta(days=83,hours=7) #你说的83天7小时
>>> a-b  #直接减去,得到
datetime.timedelta(142, 18000)      #表示142天18000秒
>>> a/20  #a除以20,得到
datetime.timedelta(11, 23760) #表示11天23760秒
>>> c=a/20
>>> print(repr(c.days)+"天"+repr(c.seconds/3600)+"小时")
11天6.6小时

本回答被提问者和网友采纳
参考技术B td_series.astype('timedelta64[D]').astype(int) 提取天数

td_series.astype('timedelta64[h]').astype(int) 提取小时
要提取月份的值再除30天,自行把握
参考技术C 其实上面的答案已经说得比较详细了,timedelta可以通过day属性获取天数,这个天数就是int型了,天数除以30就能得到月份了。
刚好最近也在看这个例子,data['LOAD_TIME']-data['FFP_DATE'] 得到的是一个datedelta类型的series,series是没有days属性的。
通过遍历可以将他全部转换成月:for i in data['LOAD_TIME']-data['FFP_DATE'] :
int( i.days/30)
就可以得到月份了。
参考技术D

    Series.dt.days

    Number of days for each element.

在 Python Pandas DataFrame 中将 timedelta64[ns] 列转换为秒

【中文标题】在 Python Pandas DataFrame 中将 timedelta64[ns] 列转换为秒【英文标题】:Convert timedelta64[ns] column to seconds in Python Pandas DataFrame 【发布时间】:2014-12-14 21:56:55 【问题描述】:

如图所示,pandas DataFrame 列 duration 包含 timedelta64[ns]。如何将它们转换为秒?

0   00:20:32
1   00:23:10
2   00:24:55
3   00:13:17
4   00:18:52
Name: duration, dtype: timedelta64[ns]

我尝试了以下

print df[:5]['duration'] / np.timedelta64(1, 's')

但出现错误

Traceback (most recent call last):
  File "test.py", line 16, in <module>
    print df[0:5]['duration'] / np.timedelta64(1, 's')
  File "C:\Python27\lib\site-packages\pandas\core\series.py", line 130, in wrapper
    "addition and subtraction, but the operator [%s] was passed" % name)
TypeError: can only operate on a timedeltas for addition and subtraction, but the operator [__div__] was passed

也试过了

print df[:5]['duration'].astype('timedelta64[s]')

但收到错误

Traceback (most recent call last):
  File "test.py", line 17, in <module>
    print df[:5]['duration'].astype('timedelta64[s]')
  File "C:\Python27\lib\site-packages\pandas\core\series.py", line 934, in astype
    values = com._astype_nansafe(self.values, dtype)
  File "C:\Python27\lib\site-packages\pandas\core\common.py", line 1653, in _astype_nansafe
    raise TypeError("cannot astype a timedelta from [%s] to [%s]" % (arr.dtype,dtype))
TypeError: cannot astype a timedelta from [timedelta64[ns]] to [timedelta64[s]]

【问题讨论】:

这是已修复的最新版本;与source code 一样,如果两边都是timedelta 加法,则支持减法和除法。该部分代码在 2013 年被更改 @behzad.nouri 是对的,我相信这是在 > 0.13.1 中修复的(可能需要 0.14),但当前是 0.15.0:pandas.pydata.org/pandas-docs/stable/… @behzad.nouri 谢谢,更新到 Pandas 0.15.0 和 numpy 1.9.0 让它工作。 【参考方案1】:

这在当前版本的 Pandas(0.14 版)中可以正常工作:

In [132]: df[:5]['duration'] / np.timedelta64(1, 's')
Out[132]: 
0    1232
1    1390
2    1495
3     797
4    1132
Name: duration, dtype: float64

以下是旧版 Pandas/NumPy 的解决方法:

In [131]: df[:5]['duration'].values.view('<i8')/10**9
Out[131]: array([1232, 1390, 1495,  797, 1132], dtype=int64)

timedelta64 和 datetime64 数据在内部存储为 8 字节整数(dtype '&lt;i8')。所以上面将 timedelta64s 视为 8 字节整数,然后执行整数 除法将纳秒转换为秒。

请注意,您 need NumPy version 1.7 or newer 使用 datetime64/timedelta64s。

【讨论】:

【参考方案2】:

使用Series dt accessor 访问日期时间(timedelta)系列的方法和属性。

>>> s
0   -1 days +23:45:14.304000
1   -1 days +23:46:57.132000
2   -1 days +23:49:25.913000
3   -1 days +23:59:48.913000
4            00:00:00.820000
dtype: timedelta64[ns]
>>>
>>> s.dt.total_seconds()
0   -885.696
1   -782.868
2   -634.087
3    -11.087
4      0.820
dtype: float64

还有其他用于字符串、分类和稀疏数据类型的 Pandas Series Accessors。

【讨论】:

这个。它比其他答案中的语法清晰一千倍。【参考方案3】:

刚刚意识到这是一个旧线程,无论如何,如果流浪者将它留在这里 像我一样只点击搜索引擎上的前 5 个结果并结束 在这里。

确保您的类型正确。

如果您想将 datetime 转换为 seconds ,只需将 datetime 对象的小时、分钟和秒的秒数相加,如果它的持续时间在一个日期内。

小时 - 小时 x 3600 = 秒 分钟 - 分钟 x 60 = 秒 秒 - 秒

linear_df['duration'].dt.hour*3600 + linear_df['duration'].dt.minute*60 + linear_df['duration'].dt.second

如果您想将 timedelta 转换为 seconds,请使用下面的方法。

linear_df[:5]['duration'].astype('timedelta64[s]')

我让它像这样工作:

start_dt 和 end_dt 列采用以下格式:

import datetime

linear_df[:5]['start_dt']

0   1970-02-22 21:32:48.000
1   2016-12-30 17:47:33.216
2   2016-12-31 09:33:27.931
3   2016-12-31 09:52:53.486
4   2016-12-31 10:29:44.611
Name: start_dt, dtype: datetime64[ns]

我的持续时间是 timedelta64[ns] 格式,它是 startend 日期时间值的减法。

linear_df['duration'] = linear_df['end_dt'] - linear_df['start_dt']

生成的持续时间列如下所示

linear_df[:5]['duration']

0          0 days 00:00:14
1   2 days 17:44:50.558000
2   0 days 15:37:28.418000
3   0 days 18:45:45.727000
4   0 days 19:21:27.159000
Name: duration, dtype: timedelta64[ns]

使用 pandas,我在两个日期之间的持续时间秒数处于浮动状态。之后更容易比较或过滤您的持续时间。

linear_df[:5]['duration'].astype('timedelta64[s]')

0        14.0
1    236690.0
2     56248.0
3     67545.0
4     69687.0
Name: duration, dtype: float64

在我的情况下,如果我想获得超过 1 秒的所有持续时间。

希望对您有所帮助。

【讨论】:

谢谢 :) 今天拯救了我的一天【参考方案4】:

使用“total_seconds()”函数:

df['durationSeconds'] = df['duration'].dt.total_seconds()

【讨论】:

【参考方案5】:

我们可以简单地使用 pandas apply() 函数

def get_seconds(time_delta):
    return time_delta.seconds

def get_microseconds(time_delta):
    return time_delta.micro_seconds

time_delta_series = df['duration']

converted_series = time_delta_series.apply(get_seconds)
print(converted_series)

【讨论】:

以上是关于怎么将python时间段(Timedelta)转化为int或float数值形式! 急。的主要内容,如果未能解决你的问题,请参考以下文章

使用python实现将秒转化为天时分

使用python实现将秒转化为天时分

pandas读取csv数据为dataframe计算dataframe中相连两行数据(记录)的时间差并将时间差从timedelta对象转化为整数

怎么用Python实现时间加减运算?

将 python 2.7 timedelta.total_seconds() 转换为 python 2.6 中的等价物

python中时间序列数据的一些处理方式