尝试使用Python将标签添加到CSV中的日期时间间隔分组时出现问题

问题描述

如果日期时间落在15分钟范围内,我想在我的Pandas df的新列中为间隔每15分钟间隔添加一个标签。 我尝试过cut,qcut,strptime和grouper都无效。

'''Basically I'd like to turn this:'''
    Date
    29/8/20 2:24       
    29/8/20 1:02
    29/8/20 0:26
    28/8/20 23:14
    28/8/20 21:57
    28/8/20 21:55
    28/8/20 21:46
    28/8/20 20:38
    28/8/20 19:40
    28/8/20 18:20
    
 '''Into this:'''
    Date             Interval
    29/8/20 2:24     Period 1
    29/8/20 1:02     Period 2
    29/8/20 0:26     Period 3
    28/8/20 23:14    Period 4
    28/8/20 21:57    Period 5
    28/8/20 21:55    Period 5
    28/8/20 21:46    Period 5
    28/8/20 21:35    Period 5
    28/8/20 19:40    Period 6
    28/8/20 18:20    Period 7
import datetime
import pandas as pd

s_date = datetime.datetime.Now()
dates = [s_date]
for days in range(1,5):
    for i in range(24 * 4):
        dates.append(dates[-1] + datetime.timedelta(minutes=15))
    dates.append(dates[0] + datetime.timedelta(days=days))

print(dates)

df['Interval'] = pd.cut(df['Date'],bins=dates,duplicates='drop',ordered=True,labels=labels,right=False).cat.add_categories([i]).fillna(i)

# Save CSV File
csv_path = r'x'
df.to_csv(csv_path + 'x' + '.csv')

解决方法

我认为您的解释不够好,但是我想我知道您要完成的工作。这个问题全与ORDER有关。对于.grouper.cut,ORDER不相关。因此,您需要使用.shift()进行逐行比较。

从本质上讲,如果下一行在15分钟之内,这听起来像是您试图在同一时间段内将时间加在一起。您可以使用.shift()比较上一行和下一行的数据,并使用dt.seconds > 900计算秒数是否大于900(即15分钟)。这将返回一系列TrueFalse。然后,只需取.cumsum()(当有一个1值时将添加True,而当0时将添加False。最后,您可以将dtype更改为a带有.astype(str)的字符串,并将'Period ' +放在开头:

df['Date'] = pd.to_datetime(df['Date'])
df['Interval'] = 'Period ' + (((df.shift()['Date'] - df['Date']).dt.seconds > 900).cumsum() + 1).astype(str)

Out[5]: 
                 Date  Interval
0 2020-08-29 02:24:00  Period 1
1 2020-08-29 01:02:00  Period 2
2 2020-08-29 00:26:00  Period 3
3 2020-08-28 23:14:00  Period 4
4 2020-08-28 21:57:00  Period 5
5 2020-08-28 21:55:00  Period 5
6 2020-08-28 21:46:00  Period 5
7 2020-08-28 20:38:00  Period 6
8 2020-08-28 19:40:00  Period 7
9 2020-08-28 18:20:00  Period 8