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

时间:2017-09-11 01:56:06

标签: 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.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()

这给了我连续索引时间戳之间的区别,但它并没有重新开始每一天。我可以将日期与datetime分开,在日期上进行groupby并计算每个日期的timediff。每天都没有第一次和最后一次设置。

获得这些timediff后,我打算获得平均值,中位数,计数等统计数据。

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

1 个答案:

答案 0 :(得分:1)

使用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.Grouperkey=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]

顺便说一句,如果您对日常统计感兴趣,可以分组并致电.describe

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