同一日期两个不同时间之间的值差

时间:2020-08-17 09:20:08

标签: python pandas datetime difference

我有一个数据框df,如下所示:

Datetime                Value
2020-03-01 08:00:00      10
2020-03-01 10:00:00      12
2020-03-01 12:00:00      15
2020-03-02 09:00:00       1
2020-03-02 10:00:00       3
2020-03-02 13:00:00       8
2020-03-03 10:00:00      20
2020-03-03 12:00:00      25
2020-03-03 14:00:00      15

我想计算每个日期的第一时间与每个日期的最后时间之间的差(忽略一个日期中其他时间的值),因此结果将是:

Datetime      Value_Difference
2020-03-01          5
2020-03-02          7
2020-03-03         -5

我一直在使用for循环来执行此操作,但是当我有更大的数据时,它会很慢(如预期的那样)。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

一个解决方案是确保数据按时间排序,按数据分组,然后获取每天的第一个和最后一个值。这是可行的,因为熊猫将在groupby期间保留顺序,请参见例如here

df = df.sort_values(by='Datetime').groupby(df['Datetime'].dt.date).agg({'Value': ['first', 'last']})
df['Value_Difference'] = df['Value']['last'] - df['Value']['first']
df = df.drop('Value', axis=1).reset_index()

结果:

Datetime      Value_Difference
2020-03-01          5
2020-03-02          7
2020-03-03         -5

答案 1 :(得分:0)

Shaido的方法有效,但是由于groupby很大,可能会很慢

另一种可能的方法是与转换为int的日期有所不同,仅获取必要的值而无需循环。

idx = df.index

loc = np.diff(idx.strftime('%Y%m%d').astype(int).values).nonzero()[0]

loc1 = np.append(0,loc)

loc2 = np.append(loc,len(idx)-1)

res = df.values[loc2]-df.values[loc1]

df = pd.DataFrame(index=idx.date[loc1],values=res,columns=['values'])