什么可以使python的日期列进程更快

时间:2018-02-13 06:26:25

标签: python pandas datetime

我有一个DataFrame包含使用时间的客户票。

ticket_end数据not正确,我必须使用ticket_start列,这是正确的,我有客户ticket_name,它描述了门票的持续时间。

我使用relativedelta(months=+numberofmonths)正在工作,但我有300k行,时间超过2小时,所以我开始找到其他选项,但所有相同,然后我再次尝试这个代码,它只花了5分钟!我没有再改变,但我不知道发生了什么,但我不得不再次启动内核,现在又花了2个多小时。

我的问题是我不知道为什么会这样?我们可以做些什么来加快日期时间列进程?

这是我的代码:

for i in tqdm(range(len(customer))):
    if  customer.ticket_name[i] == '3 month free':
        customer.ticket_end[i] = customer.ticket_start[i] + relativedelta(months=+1)

    elif customer.product_name[i] == '4 month free':  
         customer.ticket_end[i] = customer.ticket_start[i] + relativedelta(months=+4)

    elif customer.product_name[i] == '6 month free':
         customer.ticket_end[i] = customer.ticket_start[i] + relativedelta(months=+6)

    elif customer.product_name[i] == '9 month free': 
         customer.ticket_end[i] = customer.ticket_start[i] + relativedelta(months=+9)

    else:
        customer.ticket_end[i] = customer.ticket_start[i] + relativedelta(months=+1)

在代码之前,日期列是字符串,日期和时间'2015-01-28 17:59:50'

我不需要,所以我用这个删除了时间:

customer['ticket_start']= pd.to_datetime(customer['ticket_start'],format='%Y-%m-%d %H:%M:%S')
customer['ticket_start'] = map(lambda x: x.date(), customer['ticket_start'])

再次pd.to_datetime()

customer['ticket_start']= pd.to_datetime(customer['ticket_start'])

可能是关键信息,我从csv和来自mysql.connector的数据库获取数据  但现在这两个过程都是2小时。

提前致谢。

1 个答案:

答案 0 :(得分:1)

您可以使用floor删除时间,然后为months创建新列,最后按DateOffset添加:

rng = pd.date_range('2017-01-03  15:14:01', periods=30, freq='300H')
customer = pd.DataFrame({'ticket_start': rng, 'product_name': ['3 month free'] * 5 + 
                                                              ['4 month free'] * 5 + 
                                                              ['6 month free'] * 10 +
                                                              ['9 month free'] * 5 +
                                                              ['2 month free'] * 5} )  


#print (customer)

customer['ticket_start']=(pd.to_datetime(customer['ticket_start'],format='%Y-%m-%d %H:%M:%S')
                            .dt.floor('d'))
d = {'3 month free' : 1, '4 month free': 4, '6 month free':6, '9 month free':9}
customer['m'] = customer['product_name'].map(d).fillna(1).astype(int) 


customer['ticket_end'] = customer.apply(lambda x: x['ticket_start'] + 
                                    pd.offsets.DateOffset(months=x['m']), axis=1)
print (customer)
    product_name ticket_start  m ticket_end
0   3 month free   2017-01-03  1 2017-02-03
1   3 month free   2017-01-16  1 2017-02-16
2   3 month free   2017-01-28  1 2017-02-28
3   3 month free   2017-02-10  1 2017-03-10
4   3 month free   2017-02-22  1 2017-03-22
5   4 month free   2017-03-07  4 2017-07-07
6   4 month free   2017-03-19  4 2017-07-19
7   4 month free   2017-04-01  4 2017-08-01
8   4 month free   2017-04-13  4 2017-08-13
9   4 month free   2017-04-26  4 2017-08-26
10  6 month free   2017-05-08  6 2017-11-08
11  6 month free   2017-05-21  6 2017-11-21
12  6 month free   2017-06-02  6 2017-12-02
13  6 month free   2017-06-15  6 2017-12-15
14  6 month free   2017-06-27  6 2017-12-27
15  6 month free   2017-07-10  6 2018-01-10
16  6 month free   2017-07-22  6 2018-01-22
17  6 month free   2017-08-04  6 2018-02-04
18  6 month free   2017-08-16  6 2018-02-16
19  6 month free   2017-08-29  6 2018-02-28
20  9 month free   2017-09-10  9 2018-06-10
21  9 month free   2017-09-23  9 2018-06-23
22  9 month free   2017-10-05  9 2018-07-05
23  9 month free   2017-10-18  9 2018-07-18
24  9 month free   2017-10-30  9 2018-07-30
25  2 month free   2017-11-12  1 2017-12-12
26  2 month free   2017-11-24  1 2017-12-24
27  2 month free   2017-12-07  1 2018-01-07
28  2 month free   2017-12-19  1 2018-01-19
29  2 month free   2018-01-01  1 2018-02-01