代码之家  ›  专栏  ›  技术社区  ›  Ahmad Senousi

将时间划分为每30分钟一个周期

  •  -1
  • Ahmad Senousi  · 技术社区  · 8 年前

    我有一个Dataframe包含“time”列,我想在每30分钟将时间划分为时段后添加一个包含时段号的新列 例如 原始数据帧

    l = [('A','2017-01-13 00:30:00'),('A','2017-01-13 00:00:01'),('E','2017-01-13 14:00:00'),('E','2017-01-13 12:08:15')]
    df = spark.createDataFrame(l,['test','time'])
    df1 = df.select(df.test,df.time.cast('timestamp'))
    df1.show()
    +----+-------------------+
    |test|               time|
    +----+-------------------+
    |   A|2017-01-13 00:30:00|
    |   A|2017-01-13 00:00:01|
    |   E|2017-01-13 14:00:00|
    |   E|2017-01-13 12:08:15|
    +----+-------------------+
    

    所需的数据帧如下:

    +----+-------------------+------+
    |test|               time|period|
    +----+-------------------+------+
    |   A|2017-01-13 00:30:00|     2|
    |   A|2017-01-13 00:00:01|     1|
    |   E|2017-01-13 14:00:00|    29|
    |   E|2017-01-13 12:08:15|    25|
    +----+-------------------+------+
    

    有没有办法做到这一点?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Ramesh Maharjan    8 年前

    您可以简单地利用 hour 和 minute 内置函数 s以获得最终结果 when 内置函数 像

    from pyspark.sql import functions as F
    df1.withColumn('period', (F.hour(df1['time'])*2)+1+(F.when(F.minute(df1['time']) >= 30, 1).otherwise(0))).show(truncate=False)
    

    你应该

    +----+---------------------+------+
    |test|time                 |period|
    +----+---------------------+------+
    |A   |2017-01-13 00:30:00.0|2     |
    |A   |2017-01-13 00:00:01.0|1     |
    |E   |2017-01-13 14:00:00.0|29    |
    |E   |2017-01-13 12:08:15.0|25    |
    +----+---------------------+------+
    

    我希望答案有帮助