我目前有一个具有以下架构的数据框;
Year: integer (nullable = true)
Month: integer (nullable = true)
Day: integer (nullable = true)
Hour: integer (nullable = true)
Minute: integer (nullable = true)
Second: integer (nullable = true)
我想基本上向我的数据框添加一个额外的列,该列使用上述日期组件来构造日期时间类型列。我目前正在尝试使用以下内容;
df = df.withColumn("DeptDateTime",getDate(df['Year'], df['Month'], df['Day'], df['Hour'], df['Minute'], df['Second']))
我正在努力编写函数getDate
,因为我想查看Year的长度(目前是整数)&如果它是2位数(即16位),那么前缀" 20"制作" 2016"需要对每个日期组件进行此操作,以便按以下格式构建日期时间:yyyy-mm-dd hh:mm:ss
任何帮助都将不胜感激。
答案 0 :(得分:0)
您可以使用datetime模块创建格式。 以下代码对我有用,
from datetime import datetime
def getdate(*args):
dt_str = '-'.join(map(str,args[:3])) + ' ' + ':'.join(map(str,args[3:]))
yr_len = len(str(args[0]))
if yr_len == 2:
yr = 'y'
else:
yr = 'Y'
formtd_date = datetime.strptime(dt_str,"%{}-%m-%d %H:%M:%S".format(yr)).strftime("%Y-%m-%d %H:%M:%S")
return formtd_date
Test input :
1.getdate(16,1,2,4,5,6)
2.getdate(2016,1,2,04,5,58)
output :
1.2016-01-02 04:05:06
2.2016-01-02 04:05:58
答案 1 :(得分:0)
首先,让我们创建一些样本数据集。
df_pd = pd.DataFrame([[16, 3, 15],
[2016, 4, 3]],
columns=['Year', 'Month', 'Day'])
df = spark.createDataFrame(df_pd)
然后你可以编写udf
函数来解决你的问题。
from pyspark.sql import functions as func
from pyspark.sql.types import *
def get_date(year, month, day):
year = str(year)
month = str(month)
day = str(day)
if len(str(year)) == 2:
year = '20' + year
return year + '-' + month + '-' + day
udf_get_date = func.udf(get_date, returnType=StringType())
现在,我们可以将UDF功能应用于3列并再次使用.cast(DateType())
,以便您拥有正确的格式
df = df.withColumn('date', udf_get_date('Year', 'Month', 'Day').cast(DateType()))
<强>输出强>
+----+-----+---+----------+
|Year|Month|Day| date|
+----+-----+---+----------+
| 16| 3| 15|2016-03-15|
|2016| 4| 3|2016-04-03|
+----+-----+---+----------+
这非常相似,我在这里添加了一些变体,您也可以使用datetime
。
import pandas as pd
import datetime
df_pd = pd.DataFrame([[16, 3, 15, 10, 34, 14],
[2016, 4, 3, 23, 8, 12]],
columns=['Year', 'Month', 'Day', 'Hour', 'Minute', 'Second'])
df = spark.createDataFrame(df_pd)
def get_date(year, month, day, hour, minute, second):
year = str(year)
if len(str(year)) == 2:
year = '20' + year
return str(datetime.datetime(int(year), month, day, hour, minute, second))
udf_get_date = func.udf(get_date, returnType=StringType())
df = df.withColumn('date', udf_get_date('Year', 'Month', 'Day', 'Hour', 'Minute', 'Second').cast(TimestampType()))
<强>输出强>
+----+-----+---+----+------+------+--------------------+
|Year|Month|Day|Hour|Minute|Second| date|
+----+-----+---+----+------+------+--------------------+
| 16| 3| 15| 10| 34| 14|2016-03-15 10:34:...|
|2016| 4| 3| 23| 8| 12|2016-04-03 23:08:...|
+----+-----+---+----+------+------+--------------------+