ale*_*alo 6 python timedelta pandas
我觉得这应该很容易完成,但我无法弄清楚如何.我有一个pandas DataFrame列日期:
0 2012-08-21
1 2013-02-17
2 2013-02-18
3 2013-03-03
4 2013-03-04
Name: date, dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)
我希望有一列持续时间,例如:
0 0
1 80 days
2 1 day
3 15 days
4 1 day
Name: date, dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)
我的尝试产生了大量的0天NaT而是:
>>> df.date[1:] - df.date[:-1]
0 NaT
1 0 days
2 0 days
...
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
Timedeltas在这里很有用:( 见文档)
从v0.15.0开始,我们引入了一个新的标量类型Timedelta,它是datetime.timedelta的子类,行为方式类似,但允许与np.timedelta64类型兼容,以及一系列自定义表示,解析和属性.
Timedeltas是时间上的差异,以差异单位表示,例如天,小时,分钟,秒.他们可以是积极的和消极的.
df
0
0 2012-08-21
1 2013-02-17
2 2013-02-18
3 2013-03-03
4 2013-03-04
Run Code Online (Sandbox Code Playgroud)
你可以:
pd.to_timedelta(df)
TimedeltaIndex(['0 days'], dtype='timedelta64[ns]', freq=None)
0 0
1 180
2 1
3 13
4 1
Name: 0, dtype: int64
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用.shift()(或.diff()如@Andy Hayden所示)计算时间点之间的差异:
res = df-df.shift()
Run Code Online (Sandbox Code Playgroud)
要得到:
res.fillna(0)
0
0 0 days
1 180 days
2 1 days
3 13 days
4 1 days
Run Code Online (Sandbox Code Playgroud)
您可以将这些转换timedelta64 dtype为integer使用:
res.fillna(0).squeeze().dt.days
0 0
1 180
2 1
3 13
4 1
Run Code Online (Sandbox Code Playgroud)
您可以使用diff:
In [11]: s
Out[11]:
0 2012-08-21
1 2013-02-17
2 2013-02-18
3 2013-03-03
4 2013-03-04
Name: date, dtype: datetime64[ns]
In [12]: s.diff()
Out[12]:
0 NaT
1 180 days
2 1 days
3 13 days
4 1 days
Name: date, dtype: timedelta64[ns]
In [13]: s.diff().fillna(0)
Out[13]:
0 0 days
1 180 days
2 1 days
3 13 days
4 1 days
Name: date, dtype: timedelta64[ns]
Run Code Online (Sandbox Code Playgroud)