从“时间范围”数据帧1到“时间窗口”数据帧2的数据插值/分布

2024-09-28 05:22:16 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个关于计算一天中每分钟公交车乘客平均数的问题,给出了公交车行程开始和结束时间的DF1列表(小时:分钟),一个包含从任何一天(日期不可知)的凌晨3:01到凌晨3:00(次日)的“时间窗口”作为其索引的DF2。你知道吗

DF1包含每个行程的数据,使用以下代码构建:

start = [pd.to_datetime('03:01'),pd.to_datetime('03:08'),pd.to_datetime('03:06')]
finish = [pd.to_datetime('03:11'),pd.to_datetime('03:13'),pd.to_datetime('03:16')]
df1 = pd.DataFrame()
df1['passengers'] = [10, 15, 20]
df1['t1'] = start
df1['t2'] = finish
df1

导致:

            passengers  t1                  t2
0           10          2019-07-20 03:01:00 2019-07-20 03:11:00
1           15          2019-07-20 03:08:00 2019-07-20 03:13:00
2           20          2019-07-20 03:06:00 2019-07-20 03:16:00

DF2包含一个从凌晨3点01分到凌晨3点的“时间窗口”(好像常规的24小时被向前移动了3小时),如下所示:

cuthour = '03:00' # <--- user input
cuthour = pd.to_datetime(cuthour)
idx = pd.date_range(cuthour+pd.to_timedelta('1min'),'23:59', freq='T').append(pd.date_range('00:00',cuthour,freq='T'))
df2  = pd.DataFrame(index=idx)
df2['passengers'] = 0  #initialize with zeros

生成df2.info():

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 1440 entries, 2019-07-20 03:01:00 to 2019-07-20 03:00:00
Data columns (total 1 columns):
pessoas    1440 non-null int64
dtypes: int64(1)

我想要的是一个DF2,包含任何日期的平均乘客数/分钟,如下所示:

2019-07-20 03:01:00 1.0
2019-07-20 03:02:00 1.0
2019-07-20 03:03:00 1.0
2019-07-20 03:04:00 1.0
2019-07-20 03:05:00 1.0
2019-07-20 03:06:00 1.5
2019-07-20 03:07:00 1.5
2019-07-20 03:08:00 2.0
2019-07-20 03:09:00 2.0
2019-07-20 03:10:00 2.0
2019-07-20 03:11:00 2.5
2019-07-20 03:12:00 2.5
2019-07-20 03:13:00 2.0
2019-07-20 03:14:00 2.0
2019-07-20 03:15:00 2.0
2019-07-20 03:16:00 0.0
2019-07-20 03:17:00 0.0
...

但我得到的却是:

2019-07-20 03:01:00 1.0
2019-07-20 03:02:00 1.0
2019-07-20 03:03:00 1.0
2019-07-20 03:04:00 1.0
2019-07-20 03:05:00 1.0
2019-07-20 03:06:00 3.0
2019-07-20 03:07:00 3.0
2019-07-20 03:08:00 6.0
2019-07-20 03:09:00 6.0
2019-07-20 03:10:00 6.0
2019-07-20 03:11:00 5.0
2019-07-20 03:12:00 5.0
2019-07-20 03:13:00 2.0
2019-07-20 03:14:00 2.0
2019-07-20 03:15:00 2.0
2019-07-20 03:16:00 0.0
2019-07-20 03:17:00 0.0
...

使用此代码:

def calcmean(x):
    ir = pd.date_range(x.t1,x.t2,freq='T')
    lir = len(ir)-1
    mp = x.passengers/lir
    df2.loc[df2.index.isin(ir)] = df2.loc[df2.index.isin(ir)] + mp

df1.apply(calcmean, axis=1)    
df2

当然,每次旅行的平均乘客/分钟是与之前每分钟的平均值相加,而不是找到新的平均值。我找不到重新计算平均数的方法。你知道吗

为了更好地查看数据:

        mean of...              TOTAL   total
HH:MM   trip1   trip2   trip3   MEAN    sum
03:01   1                       1       1
03:02   1                       1       1
03:03   1                       1       1
03:04   1                       1       1
03:05   1                       1       1
03:06   1               2       1.5     3
03:07   1               2       1.5     3
03:08   1       3       2       2       6
03:09   1       3       2       2       6
03:10   1       3       2       2       6
03:11           3       2       2.5     5
03:12           3       2       2.5     5
03:13                   2       2       2
03:14                   2       2       2
03:15                   2       2       2


trip1 mean = 10 passengers / 10 minutes = 1 passenger/minute
trip2 mean = 15 passengers / 5 minutes = 3 passengers/minute
trip3 mean = 20 passengers / 10 minutes = 2 passengers/minute

我要的是总平均数,我得到的是总平均数。你知道吗


Tags: todataframedatetimeir时间meanpddf1

热门问题