【问题标题】:Create a dataframe with two columns (hour and minute) using a datetime index使用日期时间索引创建包含两列(小时和分钟)的数据框
【发布时间】:2023-01-11 19:25:30
【问题描述】:

大家好,我有一个包含日期时间索引的列表,时间间隔为 15 分钟(见屏幕截图)

我想创建一个只有 2 列的数据框,第一列是“小时”,第二列是“分钟”,使用这个日期时间索引。 我想要的结果是这样的:

hour   minute

08     00

08     15
08     30 etc.

是否可以? 多谢!

【问题讨论】:

  • 一般来说,请将示例数据作为文本而不是图像发布。这使得它更容易在示例性解决方案中使用。然后针对您的问题,您可以访问 dti 的各个属性,如 dti.hourdti.minute,请参阅 docs
  • 好的,谢谢,很高兴知道!!

标签: python pandas datetime datetimeindex


【解决方案1】:

如果您有专栏,您可以使用以下方法创建它们:

df['hour'] = df['timestamp'].apply(lambda x: x.hour)
df['minute'] = df['timestamp'].apply(lambda x: x.minute)

例如:

import pandas as pd
import datetime
x = [datetime.datetime.now() + datetime.timedelta(seconds=i*900) for i in range(10)]
df = pd.DataFrame(x, columns=['timestamp'])
df['hour'] = df['timestamp'].apply(lambda x: x.hour)
df['minute'] = df['timestamp'].apply(lambda x: x.minute)

结果:

                   timestamp  hour  minute
0 2023-01-11 12:08:31.045411    12       8
1 2023-01-11 12:23:31.045411    12      23
2 2023-01-11 12:38:31.045411    12      38
3 2023-01-11 12:53:31.045411    12      53
4 2023-01-11 13:08:31.045411    13       8
5 2023-01-11 13:23:31.045411    13      23
6 2023-01-11 13:38:31.045411    13      38
7 2023-01-11 13:53:31.045411    13      53
8 2023-01-11 14:08:31.045411    14       8
9 2023-01-11 14:23:31.045411    14      23

【讨论】:

    【解决方案2】:
    #sample data
    L = [pd.Index([x]) for x in pd.date_range('2022-12-23 08:30', freq='15Min', periods=5)]
    print (L)
    [DatetimeIndex(['2022-12-23 08:30:00'], dtype='datetime64[ns]', freq=None),
     DatetimeIndex(['2022-12-23 08:45:00'], dtype='datetime64[ns]', freq=None),
     DatetimeIndex(['2022-12-23 09:00:00'], dtype='datetime64[ns]', freq=None), 
     DatetimeIndex(['2022-12-23 09:15:00'], dtype='datetime64[ns]', freq=None), 
     DatetimeIndex(['2022-12-23 09:30:00'], dtype='datetime64[ns]', freq=None)]
    

    将列表推导式用于元组的几分钟和几小时的展平:

    df = pd.DataFrame([(y.hour, y.minute) for x in L for y in x], columns=['hour','minute'])
    print (df)
       hour  minute
    0     8      30
    1     8      45
    2     9       0
    3     9      15
    4     9      30
    

    如果始终有一个元素索引值是可能的,则通过索引选择第一个值:

    df = pd.DataFrame([(x[0].hour, x[0].minute) for x in L], columns=['hour','minute'])
    print (df)
       hour  minute
    0     8      30
    1     8      45
    2     9       0
    3     9      15
    4     9      30
    

    【讨论】:

      猜你喜欢
      • 2020-02-01
      • 2023-04-08
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      • 2017-08-13
      • 1970-01-01
      • 2020-03-14
      • 1970-01-01
      相关资源
      最近更新 更多