【问题标题】:How to create new columns from Pandas datetime如何从 Pandas 日期时间创建新列
【发布时间】:2020-08-21 03:45:44
【问题描述】:

我有一个带有日期时间列的数据框 df。总数据框有 2000 万行,为方便起见,我只取 3 行。

df = pd.DataFrame({})
df['Date']  = pd.to_datetime(np.arange(0,3), unit='h', origin='2018-08-01 00:00:00')

                 Date
0 2018-08-01 00:00:00
1 2018-08-01 01:00:00
2 2018-08-01 02:00:00

从日期时间开始,我想创建新列“00_hrs”、“01_hrs”、“02_hrs”(等到“23_hrs”),其中值是 0 或 1。当给定日期时间的小时是适用于列中给出的小时数,否则为 0。

结果应如下所示:

                 Date 00_hrs  01_hrs 02_hrs ... 23_hrs
0 2018-08-01 00:00:00    1      0     0          0
1 2018-08-01 01:00:00    0      1     0          0
2 2018-08-01 02:00:00    0      0     1          0 

【问题讨论】:

    标签: pandas datetime python-datetime


    【解决方案1】:

    使用get_dummiesSeries.dt.strftime 生成的小时数,然后添加到DataFrame.join 的原始时间:

    df = df.join(pd.get_dummies(df['Date'].dt.strftime('%H_hrs')))
    print (df)
                     Date  00_hrs  01_hrs  02_hrs
    0 2018-08-01 00:00:00       1       0       0
    1 2018-08-01 01:00:00       0       1       0
    2 2018-08-01 02:00:00       0       0       1
    

    如果可能缺少几个小时,可以通过DataFrame.reindex 添加它们:

    hours = [f'{n:02}_hrs' for n in range(24)]
    df = (df.join(pd.get_dummies(df['Date'].dt.strftime('%H_hrs'))
                    .reindex(hours, axis=1, fill_value=0)))
    print (df)
                     Date  00_hrs  01_hrs  02_hrs  03_hrs  04_hrs  05_hrs  06_hrs  \
    0 2018-08-01 00:00:00       1       0       0       0       0       0       0   
    1 2018-08-01 01:00:00       0       1       0       0       0       0       0   
    2 2018-08-01 02:00:00       0       0       1       0       0       0       0   
    
       07_hrs  08_hrs  09_hrs  10_hrs  11_hrs  12_hrs  13_hrs  14_hrs  15_hrs  \
    0       0       0       0       0       0       0       0       0       0   
    1       0       0       0       0       0       0       0       0       0   
    2       0       0       0       0       0       0       0       0       0   
    
       16_hrs  17_hrs  18_hrs  19_hrs  20_hrs  21_hrs  22_hrs  23_hrs  
    0       0       0       0       0       0       0       0       0  
    1       0       0       0       0       0       0       0       0  
    2       0       0       0       0       0       0       0       0  
    

    【讨论】:

    • 谢谢,结果符合预期。如何获取包含 XX_hrs 的所有列名的列表?我的数据框中还有其他列名,因此以下内容不起作用:col_list = [] for item in df.columns: col_list.append(item)
    • 最简单的是将df = df.join(pd.get_dummies(df['Date'].dt.strftime('%H_hrs')))拆分为df1 = pd.get_dummies(df['Date'].dt.strftime('%H_hrs'))df = df.join(df1)然后print (df1.column)
    猜你喜欢
    • 2021-01-30
    • 2018-09-16
    • 1970-01-01
    • 2022-12-10
    • 2017-08-13
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    相关资源
    最近更新 更多