Python PySpark:在日期为字符串的范围内按日期筛选数据帧字段

Python PySpark:在日期为字符串的范围内按日期筛选数据帧字段,python,date,datetime,dataframe,pyspark,Python,Date,Datetime,Dataframe,Pyspark,例如,My dataframes包含一个日期字段,它以字符串格式显示 '2015-07-02T11:22:21.050Z' 我需要过滤日期上的数据框,以仅获取上周的记录。 因此,我尝试了一种映射方法,使用strtime将字符串日期转换为datetime对象: def map_to_datetime(row): format_string = '%Y-%m-%dT%H:%M:%S.%fZ' row.date = datetime.strptime(row.date, form

例如,My dataframes包含一个日期字段,它以字符串格式显示

'2015-07-02T11:22:21.050Z'
我需要过滤日期上的数据框,以仅获取上周的记录。 因此,我尝试了一种映射方法,使用strtime将字符串日期转换为datetime对象:

def map_to_datetime(row):
     format_string = '%Y-%m-%dT%H:%M:%S.%fZ'
     row.date = datetime.strptime(row.date, format_string)

df = df.map(map_to_datetime)
然后我将应用一个过滤器作为

df.filter(lambda row:
    row.date >= (datetime.today() - timedelta(days=7)))
我设法使映射正常工作,但筛选器失败

TypeError:条件应为字符串或列


有没有一种方法可以有效地使用过滤,或者我应该改变方法和方式?

我找到了一种方法,通过使用带有字符串格式日期的SparkSQL API来解决我的问题

以下是一个例子:

last_week = (datetime.today() - timedelta(days=7)).strftime(format='%Y-%m-%d')

new_df = df.where(df.date >= last_week)

火花>=1.5

您可以使用
INTERVAL

从pyspark.sql.functions导入expr,当前_日期
df_casted.其中(col(“dt”)>=当前日期()-expr(“间隔7天”))
火花<1.5

您可以在不使用工作端Python代码和切换到RDD的情况下解决这个问题。首先,由于您使用ISO 8601字符串,您的数据可以直接转换为日期或时间戳:

从pyspark.sql.functions导入col
df=sc.parallelize([
('2015-07-02T11:22:21.050Z',),
(‘2016-03-20T21:00:00.000Z’,)
]).toDF((“杜街”))
df_casted=df.选择(“*”,
col(“d_str”).演员阵容(“日期”).别名(“dt”),
col(“d_str”).cast(“时间戳”).alias(“ts”))
这将节省JVM和Python之间的一次往返。还有一些方法可以让你接近第二部分。仅限日期:

从pyspark.sql.functions导入当前\u日期、datediff、unix\u时间戳
df_casted.where(datediff(当前日期(),col(“dt”))<7)
时间戳:

def天数(i:int)->int:
返回60*60*24*i
df_casted.where(unix_timestamp()-col(“ts”).cast(“long”)
您还可以查看
current\u timestamp
date\u sub

注意:我会避免使用
DataFrame.map
。最好改用
DataFrame.rdd.map
。切换到2.0+

import datetime last_week=(datetime.datetime.today()-datetime.timedelta(days=7)).strftime(格式=“%Y-%m-%d”)时,可以节省一些工作