Python 使用pandas分别查找每天连续时间戳之间的差异

Python 使用pandas分别查找每天连续时间戳之间的差异,python,pandas,datetime,dataframe,group-by,Python,Pandas,Datetime,Dataframe,Group By,我有一个带有日期时间索引的数据框: >>> d.head() Out[29]: Value Time 2017-04-02 21:11:00.221 1114.73 2017-04-03 00:01:00.221 1114

我有一个带有日期时间索引的数据框:

>>> d.head()
Out[29]: 
                         Value 
Time                                                                                                  
2017-04-02 21:11:00.221  1114.73   
2017-04-03 00:01:00.221  1114.73 
2017-04-03 00:01:01.345  1114.73 
2017-04-03 00:01:02.701  1114.10  
我想得到指数时间的连续差异,但每天是分开的。我目前正在做这项不完整的工作:

d['datetime']= d.index
d['datetime_diff']=d['datetime'].diff()
这给了我连续索引时间戳之间的差异,但它不会每天重新开始。我可以将日期与日期时间分开,对日期进行分组并计算每个日期的时间差。每天没有固定的第一次和最后一次

在获得这些时间差之后,我打算获得诸如平均值、中值、计数等统计数据


有更好的方法吗?我想这会导致一个不同的问题,即每天标记第一个值。现在我可以使用group by轻松地获取每天的第一个值,但这并不能解决问题,因为我需要一种简单的方法来标记第一个值,而不是检索第一个值。

使用
pd.TimeGrouper
,并按
1D的频率分组

diff = df.groupby(pd.TimeGrouper(freq='1D')).diff()
diff

                         Value
Time                          
2017-04-02 21:11:00.221    NaN
2017-04-03 00:01:00.221    NaN
2017-04-03 00:01:01.345   0.00
2017-04-03 00:01:02.701  -0.63
如果
df.Time
不是
DateTime
类型,则需要将其转换为:

df.index = pd.to_datetime(df.index)

要仅获取索引的差异,有一种更简单的方法-首先,
reset_index
,然后
groupby
并仅在该列上调用
.diff
。您也可以将
pd.Grouper
key=Time
一起使用

diff = df.reset_index().groupby(pd.Grouper(key='Time', freq='1D')).Time.diff()
diff

0               NaT
1               NaT
2   00:00:01.124000
3   00:00:01.356000
Name: Time, dtype: timedelta64[ns]

另外,如果您对每日统计数据感兴趣,您可以分组并致电
。描述

g = df.groupby(pd.Grouper(level=0, freq='1D'))
g.describe()

           Value                                                          \
           count     mean       std      min       25%      50%      75%   
Time                                                                       
2017-04-02   1.0  1114.73       NaN  1114.73  1114.730  1114.73  1114.73   
2017-04-03   3.0  1114.52  0.363731  1114.10  1114.415  1114.73  1114.73   


                max  
Time                 
2017-04-02  1114.73  
2017-04-03  1114.73 

太棒了,谢谢。只是一个小附录-我实际上需要时间戳(索引)的差异,而不是值。我的df也有一些非数字列,所以我对您的代码进行了如下修改:{d['diff']=pd.DataFrame(d.index,index=d.index).groupby(pd.TimeGrouper(freq='1D'))).diff()}。您认为这有问题吗?@dayum应该意识到这就是您想要的。事实上,有一个更简单的方法。请检查我的编辑。