首页 > 解决方案 > 如何使用python将额外的时间添加到带有数据的时间列中

问题描述

在这里,我有一个包含日期、时间和一个输入列的数据集。所以这里我的时间专栏不好。所以我想在那个时间列中给出时间范围。所以在这里我首先将开始时间转换为 0 并将整个时间列转换为分钟。

然后接下来我想给出时间范围0,60,120....

意思是我预期的输出是:

第一次转换

date	     time         time          
10/3/2018	6:15:00       0              
10/3/2018	6:45:00       30             
10/3/2018	7:45:00       90              
10/3/2018	9:00:00       165.0           
10/3/2018	9:25:00       190.0           
10/3/2018	9:30:00       195.0            
10/3/2018	11:00:00      285.0
10/3/2018	11:30:00      315.0

预期产出

time            x3
0               7
30              5
60              0
120             0
165             7
180             0
190             7
195             5
240             0
285             7
300             0
315             7

60,120,180... 所以在这里你可以看到为 x3 值不可用添加的额外时间然后添加0到 x3 列

所以在这里我只想做的是extra 60 min 60 min add to the time column

这里我写了转换时间的代码。但我不知道如何将额外的 60 分钟填充到时间列中。

我的代码:

data['date']= pd.to_datetime(data['date'] + " " + data['time'],
                    format='%d/%m/%Y %H:%M:%S', dayfirst=True)

lastday = data.loc[0, 'date']
def convert_time(x):
global lastday
if x.date() == lastday.date():
    tm = x - lastday
    return tm.total_seconds()/60
else:
    lastday = x
    return 0

data['time'] = data['date'].apply(convert_time)

谁能帮我解决这个问题?

我的 csv 的子集:

date	time	X3
10/3/2018	6:15:00	7
10/3/2018	6:45:00	5
10/3/2018	7:45:00	7
10/3/2018	9:00:00	7
10/3/2018	9:25:00	7
10/3/2018	9:30:00	5
10/3/2018	11:00:00	7
10/3/2018	11:30:00	7
10/3/2018	13:30:00	7
10/3/2018	13:50:00	5
10/3/2018	15:00:00	7
10/3/2018	15:25:00	7
10/3/2018	16:25:00	7
10/3/2018	18:00:00	7
10/3/2018	19:00:00	5

我的 csv : 在此处输入链接描述

供参考:

                   expected time                            
                         0.0
                         30.0             
                         60
                         90.0 
                         120
                         165.0
                         180
                         190.0
                         195.0
                         240
                         285.0
                         300
                         315.0
                         360
                         420
                         435
                         455
                         480
                         525
                         540
                         550
                          :
                          :
                          :
                          :
                          0   new date ,start time=0
                          2
                          47
                          60
                          120
                          152
                          180
                                              

标签: python-3.xpandastime

解决方案


利用:

data['date']= pd.to_datetime(data['date'] + " " + data['time'],
                    format='%d/%m/%Y %H:%M:%S', dayfirst=True)

减去日期列的 firat 值并转换为分钟:

data['time1'] = data['date'].sub(data.loc[0, 'date']).dt.total_seconds()/60
print (data)
                  date      time  X3  time1
0  2018-03-10 06:15:00   6:15:00   7    0.0
1  2018-03-10 06:45:00   6:45:00   5   30.0
2  2018-03-10 07:45:00   7:45:00   7   90.0
3  2018-03-10 09:00:00   9:00:00   7  165.0
4  2018-03-10 09:25:00   9:25:00   7  190.0
5  2018-03-10 09:30:00   9:30:00   5  195.0
6  2018-03-10 11:00:00  11:00:00   7  285.0
7  2018-03-10 11:30:00  11:30:00   7  315.0
8  2018-03-10 13:30:00  13:30:00   7  435.0
9  2018-03-10 13:50:00  13:50:00   5  455.0
10 2018-03-10 15:00:00  15:00:00   7  525.0
11 2018-03-10 15:25:00  15:25:00   7  550.0
12 2018-03-10 16:25:00  16:25:00   7  610.0
13 2018-03-10 18:00:00  18:00:00   7  705.0
14 2018-03-10 19:00:00  19:00:00   5  765.0

创建新的60范围值:

arr = np.arange(0, int(data['time1'].max()), 60)
print (arr)
[  0  60 120 180 240 300 360 420 480 540 600 660 720]

与分钟列一起加入:

union = np.union1d(data['time1'], arr)
print (union)
[  0.  30.  60.  90. 120. 165. 180. 190. 195. 240. 285. 300. 315. 360.
 420. 435. 455. 480. 525. 540. 550. 600. 610. 660. 705. 720. 765.]

time1按列创建索引并DataFrame.reindex从以下位置添加新值arr

data = data.set_index('time1')['X3'].reindex(union, fill_value=0).reset_index()
print (data)
    time1  X3
0     0.0   7
1    30.0   5
2    60.0   0
3    90.0   7
4   120.0   0
5   165.0   7
6   180.0   0
7   190.0   7
8   195.0   5
9   240.0   0
10  285.0   7
11  300.0   0
12  315.0   7
13  360.0   0
14  420.0   0
15  435.0   7
16  455.0   5
17  480.0   0
18  525.0   7
19  540.0   0
20  550.0   7
21  600.0   0
22  610.0   7
23  660.0   0
24  705.0   7
25  720.0   0
26  765.0   5

推荐阅读