我有一个带有日期时间索引的数据框:
>>> 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]
<小时/>
顺便说一句,如果您对每日统计数据感兴趣,您可以 groupby 并调用 .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
关于python - 使用 pandas 分别查找每天连续时间戳之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46147230/