按列值分组2小时

时间:2019-09-27 05:02:34

标签: python loops dataframe

我有一个带有日期,时间,距离列的数据框。我想每天以2小时间隔对距离列进行分组。我已经检查了堆栈溢出中提出的问题,但未提供所需的输出。

我粘贴的示例代码来自堆栈溢出,但是输出不符合要求。

uniquedate = np.unique(df2["Date"])
for i in uniquedate:
    data_new1 = df2[df2['Date']==i]
    data_new2 = data_new1[['Real_time', 'Distance_km']].copy()
    data_new2.index = pd.to_timedelta(data_new2.index.astype(str))
    data_new2 = data_new2.resample('2H').sum()
    print(data_new2)

                 Distance_km
00:00:00.000000   276.850844
                 Distance_km
00:00:00.000000   193.115217

我得到了这个输出,但这不是必需的

2 个答案:

答案 0 :(得分:1)

尝试一下:

data_new2.groupby([data_new2.index,pd.TimeGrouper(freq='2H')]).sum()

请避免从堆栈溢出中复制粘贴代码。通常,该解决方案不足以满足您的用例。而且它很懒。

编辑 将您的索引设置为日期时间或时间戳记,然后对您进行简单的重新采样就可以了。

import pandas as pd
idx = pd.date_range('2018-01-01', periods=5, freq='H')
ts = pd.Series(range(len(idx)), index=idx)
ts = ts.resample('2H').sum()

答案 1 :(得分:0)

我不确定我是否正确-主要是因为您没有发布数据示例。

但是,这是一个mcve:

# dtrg = pd.date_range('01.Jan.1999 21:17', '02.Jan.1999 04:23', freq='10min')
# df = pd.DataFrame({'distance': np.random.randint(1, 5, len(dtrg)) * 10}, index=dtrg)

# df.head()
#                      distance
# 1999-01-01 21:17:00        30
# 1999-01-01 21:27:00        40
# 1999-01-01 21:37:00        10
# 1999-01-01 21:47:00        30
# 1999-01-01 21:57:00        30

使用此数据,您可以按2H切片简单地对日期时间索引进行分组,并总结距离:

df.groupby(pd.Grouper(freq='2H')).sum()

                     distance
1999-01-01 20:00:00       140
1999-01-01 22:00:00       340
1999-01-02 00:00:00       370
1999-01-02 02:00:00       300
1999-01-02 04:00:00        40

...并且如果您的数据框没有日期时间索引,但日期和时间作为单独的字符串值,则应将它们转换为日期时间,然后将其设置为索引:

示例数据框结构:

         date   time  distance
0  01.01.1999  09:00        10

将日期和时间列转换为日期时间索引:

df.set_index(pd.to_datetime(df.date.str.cat(df.time, sep=' '))).distance

date
1999-01-01 09:00:00    10
Name: distance, dtype: int64