【问题标题】:How to discretize a datetime column?如何离散化日期时间列?
【发布时间】:2021-12-31 14:27:41
【问题描述】:
我有一个数据集,其中包含一列月份的日期时间,我需要将其分成两个块(白天和晚上或上午\下午),然后将每个块中的时间离散化为 10 分钟的箱子。我可以添加另一列 0 和 1 来显示它是上午还是下午,但我无法离散化它!你能帮我解决一下吗?
df['started_at'] = pd.to_datetime(df['started_at'])
df['start hour'] = df['started_at'].dt.hour.astype('int')
df['mor/aft'] = np.where(df['start hour'] < 12, 1, 0)
df['started_at']
0 16:05:36
2 06:22:40
3 16:08:10
4 12:28:57
6 15:47:30
...
3084526 15:24:24
3084527 16:33:07
3084532 14:08:12
3084535 09:43:46
3084536 17:02:26
【问题讨论】:
标签:
python
pandas
dataframe
datetime
discretization
【解决方案1】:
如果我理解正确,您会尝试为每十分钟的间隔添加一列,以指示观察是否来自该时间间隔。
您可以使用lambda expressions 循环查看系列中的每个观察结果。
除以 10 并将其设为整数会给出分钟的第一位数字,您可以在此基础上添加指标列。
我还包括了如何提取带有lambda expression 的日期指示列供您比较。它与您的np.where() 实现相同。
import pandas as pd
from datetime import datetime
# make dataframe
df = pd.DataFrame({
'started_at': ['14:20:56',
'00:13:24',
'16:01:33']
})
# convert column to datetime
df['started_at'] = pd.to_datetime(df['started_at'])
# make day indicator column
df['day'] = df['started_at'].apply(lambda ts: 1 if ts.hour > 12 else 0)
# make indicator column for every ten minutes
for i in range(24):
for j in range(6):
col = 'hour_' + str(i) + '_min_' + str(j) + '0'
df[col] = df['started_at'].apply(lambda ts: 1 if int(ts.minute/10) == j and ts.hour == i else 0)
print(df)
输出第一列:
started_at day hour_0_min_00 hour_0_min_10 hour_0_min_20
0 2021-11-21 14:20:56 1 0 0 0
1 2021-11-21 00:13:24 0 0 1 0
2 2021-11-21 16:01:33 1 0 0 0
...
...
...