问题描述
如果日期时间落在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分钟)。这将返回一系列True
或False
。然后,只需取.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