【问题标题】:How to find harmonic average speeds from pandas dataframe如何从熊猫数据框中找到谐波平均速度
【发布时间】:2017-06-24 22:45:03
【问题描述】:

我有一个 pandas 数据框,其中有一列以 KmH 为单位的速度和一列时间戳:

Date,                     Speed
2016-07-07 13:38:02.000,  50.718590
2016-07-18 11:28:00.000,   2.357645
2016-07-15 15:03:08.000,  14.652172
2016-07-18 06:53:00.000,  24.530390
...                       ...
2016-07-18 18:41:31.000,  31.761416
2016-07-14 05:28:42.187,   7.532758

我想要的是平均每天每 15 分钟有一个harmonic average speed

Time,  Speed
00:00, 32
00:15, 10
00:30, 12
00:45, 41
01:00, 12
...
23:30, 30
23:45, 31

我最初的尝试是从每个时间戳中删除日期,将其设置为索引,然后使用 TimeGrouper 来查找平均值。 (我的数据框称为输出)代码是:

output['Speed'] = output['Speed']**-1
output['Date'] = output['Date'].apply( lambda d : d.time() )
output = output.set_index(['Date'])
output = output.groupby(pd.TimeGrouper('15Min')).mean()
output['Speed'] = output['Speed']**-1

代码不起作用,因为它给了我一个错误:

 Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'Int64Index'

【问题讨论】:

  • 您可以尝试不将日期时间更改为仅时间的第一行,所以只需output = output.set_index(['Date']) output = output.groupby(pd.TimeGrouper('15Min')).mean()
  • 它不会产生错误,但是它会创建从第一个日期到最后一个日期每 15 分钟的平均速度,而我想要的是每天平均一次。
  • 好的,你可以做的一件事是通过这样做pd.to_datetime(df['date'].dt.strftime('%H:%M:%S'))来标准化日期,这会将所有条目的日期设置为相同,然后你可以做你之前做的事情

标签: python python-3.x sorting date pandas


【解决方案1】:

我认为您想要做的是将日期标准化,然后进行重新采样:

In [177]:
df['Date'] = pd.to_datetime(df['Date'].dt.strftime('%H:%M:%S'))
df

Out[177]:
                 Date      Speed
0 2017-02-07 13:38:02  50.718590
1 2017-02-07 11:28:00   2.357645
2 2017-02-07 15:03:08  14.652172
3 2017-02-07 06:53:00  24.530390
4 2017-02-07 18:41:31  31.761416
5 2017-02-07 05:28:42   7.532758

现在所有日期都相同,默认为今天,然后做你想做的事:

In [178]:
output = df.set_index('Date')
output = output.groupby(pd.TimeGrouper('15Min')).mean()
output['Speed'] = output['Speed']**-1
output

Out[178]:
                        Speed
Date                         
2017-02-07 05:15:00  0.132754
2017-02-07 05:30:00       NaN
2017-02-07 05:45:00       NaN
2017-02-07 06:00:00       NaN
2017-02-07 06:15:00       NaN
2017-02-07 06:30:00       NaN
2017-02-07 06:45:00  0.040766
2017-02-07 07:00:00       NaN
2017-02-07 07:15:00       NaN
2017-02-07 07:30:00       NaN
2017-02-07 07:45:00       NaN
2017-02-07 08:00:00       NaN
2017-02-07 08:15:00       NaN
2017-02-07 08:30:00       NaN
2017-02-07 08:45:00       NaN
2017-02-07 09:00:00       NaN
2017-02-07 09:15:00       NaN
2017-02-07 09:30:00       NaN
2017-02-07 09:45:00       NaN
2017-02-07 10:00:00       NaN
2017-02-07 10:15:00       NaN
2017-02-07 10:30:00       NaN
2017-02-07 10:45:00       NaN
2017-02-07 11:00:00       NaN
2017-02-07 11:15:00  0.424152
2017-02-07 11:30:00       NaN
2017-02-07 11:45:00       NaN
2017-02-07 12:00:00       NaN
2017-02-07 12:15:00       NaN
2017-02-07 12:30:00       NaN
2017-02-07 12:45:00       NaN
2017-02-07 13:00:00       NaN
2017-02-07 13:15:00       NaN
2017-02-07 13:30:00  0.019717
2017-02-07 13:45:00       NaN
2017-02-07 14:00:00       NaN
2017-02-07 14:15:00       NaN
2017-02-07 14:30:00       NaN
2017-02-07 14:45:00       NaN
2017-02-07 15:00:00  0.068249
2017-02-07 15:15:00       NaN
2017-02-07 15:30:00       NaN
2017-02-07 15:45:00       NaN
2017-02-07 16:00:00       NaN
2017-02-07 16:15:00       NaN
2017-02-07 16:30:00       NaN
2017-02-07 16:45:00       NaN
2017-02-07 17:00:00       NaN
2017-02-07 17:15:00       NaN
2017-02-07 17:30:00       NaN
2017-02-07 17:45:00       NaN
2017-02-07 18:00:00       NaN
2017-02-07 18:15:00       NaN
2017-02-07 18:30:00  0.031485

这样:

df['Date'] = pd.to_datetime(df['Date'].dt.strftime('%H:%M:%S'))

这样做是使用dt.strftime 将时间提取为字符串,然后我们可以使用to_datetime 创建一个所有日期都相同的 datetime64 系列

【讨论】:

    猜你喜欢
    • 2021-03-10
    • 2018-10-26
    • 2018-05-15
    • 1970-01-01
    • 2018-11-16
    • 2015-04-25
    • 2018-04-15
    • 1970-01-01
    • 2016-03-03
    相关资源
    最近更新 更多