Pandas 按日期时间分组

Pandas 按日期时间分组,pandas,datetime,grouping,Pandas,Datetime,Grouping,我有一个熊猫数据框,看起来像这样: df = pd.DataFrame({}) df['Date'] = pd.to_datetime(np.arange(0,11), unit='h', origin='2018-08-01 00:00:00') Date 0 2018-08-01 00:00:00 1 2018-08-01 01:00:00 2 2018-08-01 02:00:00 3 2018-08-01 03:00:00 4 2018-08-01

我有一个熊猫数据框,看起来像这样:

df = pd.DataFrame({})
df['Date']  = pd.to_datetime(np.arange(0,11), unit='h', origin='2018-08-01 00:00:00')

                 Date
0 2018-08-01 00:00:00
1 2018-08-01 01:00:00
2 2018-08-01 02:00:00
3 2018-08-01 03:00:00
4 2018-08-01 04:00:00
5 2018-08-01 05:00:00
6 2018-08-01 06:00:00
7 2018-08-01 07:00:00
8 2018-08-01 08:00:00
9 2018-08-01 09:00:00
10 2018-08-01 10:00:00
我想创建一个新的列“Trip”,它是一个整数,告诉我它是哪个Trip。行程开始后4小时内的所有记录应为行程的一部分。结果必须如下所示:

                 Date   Trip
0 2018-08-01 00:00:00   1
1 2018-08-01 01:00:00   1
2 2018-08-01 02:00:00   1
3 2018-08-01 03:00:00   1
4 2018-08-01 04:00:00   1
5 2018-08-01 05:00:00   2
6 2018-08-01 06:00:00   2
7 2018-08-01 07:00:00   2
8 2018-08-01 08:00:00   2
9 2018-08-01 09:00:00   2
10 2018-08-01 10:00:00  3

你知道怎么做吗?

你可以使用像这样的lambda:

df["Trip"] = df.apply(lambda x: (x["Date"].hour // 5) + 1, axis=1)
5将是您希望覆盖的小时数
+1
在这里,因为您想从行程1开始

开始时间不同于00:00:00

origin = df["Date"][0].hour
df["Trip"] = df.apply(lambda x: ((x["Date"].hour - origin) // 5) + 1, axis=1)
其他方法:

df["Trip"] = df.apply(lambda x: ((x["Date"].hour - origin) // 4.0) + 1, axis=1)
如果需要,不要忘记转换为
int

给你。享受吧

import pandas as pd
import numpy as np

df = pd.DataFrame({})
df['Date']  = pd.to_datetime(np.arange(0,11), unit='h', origin='2018-08-01 00:00:00')

def get_cum_time(x):

    diff_time = x.Date - x.prev_date

    return diff_time / np.timedelta64(1, 'h')

df['prev_date'] = df.Date.shift(1)

df['diff_time'] = df.apply(get_cum_time, axis=1)
df['cum_time'] = df.diff_time.cumsum()

df.cum_time.fillna(1.0, inplace=True)

def get_trip(x):
    return x // 4 + 1

df['Trip'] = df.cum_time.apply(get_trip)

print(df)
输出:

                      Date           prev_date  diff_time  cum_time  Trip
0  2018-08-01 00:00:00                 NaT        NaN       1.0   1.0
1  2018-08-01 01:00:00 2018-08-01 00:00:00        1.0       1.0   1.0
2  2018-08-01 02:00:00 2018-08-01 01:00:00        1.0       2.0   1.0
3  2018-08-01 03:00:00 2018-08-01 02:00:00        1.0       3.0   1.0
4  2018-08-01 04:00:00 2018-08-01 03:00:00        1.0       4.0   2.0
5  2018-08-01 05:00:00 2018-08-01 04:00:00        1.0       5.0   2.0
6  2018-08-01 06:00:00 2018-08-01 05:00:00        1.0       6.0   2.0
7  2018-08-01 07:00:00 2018-08-01 06:00:00        1.0       7.0   2.0
8  2018-08-01 08:00:00 2018-08-01 07:00:00        1.0       8.0   3.0
9  2018-08-01 09:00:00 2018-08-01 08:00:00        1.0       9.0   3.0
10 2018-08-01 10:00:00 2018-08-01 09:00:00        1.0      10.0   3.0

谢谢但是,这假设数据总是每5小时提供一次。如果不是,它将显示行程1、3、4等。在这种情况下,它起作用,但不是一般性的。解决方案应在第一个索引的开头。如果原点为'2018-08-01 03:00:00',则不起作用,因为在索引8之前,如果在
df=pd.DataFrame({'year':[2018,2018201820182018],'month':[1,1,1,1],'day':[5,5,5,5],'hour':[1,2,5,9,10],minute:[0,15,30,40,50]})df['Date']=pd.to_datetime(df,format='%Y%m%d%H:%m')
它显示行程1,1,3,5,5,而不是1,1,2,3,3,然后我可以执行:
df['trip']=df.groupby('trip').ngroup()+1
,我会看看这是否在所有情况下都有效,我得到了:1,1,1,2,2代码:df=pd.DataFrame({'year':[2018,2018201820182018],'month':[1,1,1,1,1,1,1,1],'day':[5,5,5,5,5],'hour':[1,2,5,9,10],'minute':[0,15,30,40,50])df['Date']=pd.to_datetime(df,format='%Y%m%d%H:%m')origin=df[“hour”[]].hour-origin)//5)+1,axis=1)谢谢,现在可以用了。您知道如何在索引级别内执行
df[“Trip”]=df.apply(lambda x:((x[“Date”].hour-origin)//4.0)+1,axis=1)
(例如,对所有不同的索引执行此操作?