【问题标题】: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   
...
...
...
 

【讨论】:

  • 帮助很大。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
相关资源
最近更新 更多