如何离散化日期时间列?

How to discretize a datetime column?

我有一个数据集,其中包含一个月的日期时间列,我需要将其分成两个块(白天和黑夜或 am\pm),然后将每个块中的时间离散化为 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

如果我理解正确的话,您正尝试为每十分钟的时间间隔添加一列以指示观察是否来自该时间间隔。

您可以使用 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   
...
...
...