我觉得这应该很容易完成,但我无法弄清楚如何。我的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]
我希望有一段持续时间,例如:
0 0
1 80 days
2 1 day
3 15 days
4 1 day
Name: date, dtype: datetime64[ns]
我的尝试产生了大量的0天和NaT
代替:
>>> df.date[1:] - df.date[:-1]
0 NaT
1 0 days
2 0 days
...
有什么想法吗?
答案 0 :(得分:6)
Timedeltas
在这里很有用:(see docs)
从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
你可以:
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
或者,您可以使用.shift()
(或.diff()
计算时间点之间的差异,如@Andy Hayden所示:
res = df-df.shift()
得到:
res.fillna(0)
0
0 0 days
1 180 days
2 1 days
3 13 days
4 1 days
您可以使用以下内容将这些内容从timedelta64
dtype
转换为integer
res.fillna(0).squeeze().dt.days
0 0
1 180
2 1
3 13
4 1
答案 1 :(得分:4)
您可以使用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]
答案 2 :(得分:2)
df.date[1:] - df.date[:-1]
没有按照您的想法行事。每个元素都通过系列/数据框索引映射减去,而不是按系列中的位置减去。
计算df.date[1:] - df.date[:-1]
会:
+---- index of df.date[1:]
| +---- index of df.date[:-1]
| |
| v
v
- 0 2012-08-21 = NaT
1 2013-02-17 - 1 2013-02-17 = 0
2 2013-02-18 - 2 2013-02-18 = 0
3 2013-03-03 - 3 2013-03-03 = 0
4 2013-03-04 - = NaT