Pyspark स्ट्रिंग को दिनांक स्वरूप में परिवर्तित करें


80

मेरे पास एक स्ट्रिंग कॉलम के साथ एक डेट पीस्पार्क डेटाफ्रेम है MM-dd-yyyyऔर मैं इसे डेट कॉलम में परिवर्तित करने का प्रयास कर रहा हूं।

मैंने कोशिश की:

df.select(to_date(df.STRING_COLUMN).alias('new_date')).show()

और मुझे एक नल मिलता है। क्या कोई मदद कर सकता है?


जब तक आप TimeSeriesRDD एडोन में से एक का उपयोग कर रहे हैं (कुछ चर्चा के लिए स्पार्क 2016 सम्मेलन देखें, वहां दो मुझे पता हैं, लेकिन दोनों अभी भी विकास में हैं), समय श्रृंखला के लिए बहुत सारे महान उपकरण नहीं हैं। तदनुसार, मैंने पाया है कि शायद ही कभी डेटामेंट ऑब्जेक्ट्स में स्ट्रिंग्स को परिवर्तित करने के लिए परेशान करने का एक कारण है, यदि आपका लक्ष्य groupByक्रियाशील या फिर से कनेक्ट होने वाले संचालन का प्रकार है । बस उन्हें स्ट्रिंग कॉलम पर प्रदर्शन करें।
जेफ

यह विश्लेषण groupByमेडिकल रिकॉर्ड के कम नहीं बल्कि अनुदैर्ध्य अध्ययन का उपयोग करके किया जाएगा । इसलिए तिथि में हेरफेर करने में सक्षम होना महत्वपूर्ण है
जेनक्स

जवाबों:


114

अपडेट (1/10/2018):

स्पार्क 2.2+ के लिए ऐसा करने का सबसे अच्छा तरीका संभवतः to_dateया to_timestampफ़ंक्शंस का उपयोग कर रहा है, जो दोनों formatतर्क का समर्थन करते हैं। डॉक्स से:

>>> from pyspark.sql.functions import to_timestamp
>>> df = spark.createDataFrame([('1997-02-28 10:30:00',)], ['t'])
>>> df.select(to_timestamp(df.t, 'yyyy-MM-dd HH:mm:ss').alias('dt')).collect()
[Row(dt=datetime.datetime(1997, 2, 28, 10, 30))]

मूल उत्तर (स्पार्क <2.2 के लिए)

यह संभव है (बेहतर) एक udf के बिना ऐसा करने के लिए:

from pyspark.sql.functions import unix_timestamp, from_unixtime

df = spark.createDataFrame(
    [("11/25/1991",), ("11/24/1991",), ("11/30/1991",)], 
    ['date_str']
)

df2 = df.select(
    'date_str', 
    from_unixtime(unix_timestamp('date_str', 'MM/dd/yyy')).alias('date')
)

print(df2)
#DataFrame[date_str: string, date: timestamp]

df2.show(truncate=False)
#+----------+-------------------+
#|date_str  |date               |
#+----------+-------------------+
#|11/25/1991|1991-11-25 00:00:00|
#|11/24/1991|1991-11-24 00:00:00|
#|11/30/1991|1991-11-30 00:00:00|
#+----------+-------------------+

3
यह सही जवाब है। इसके लिए एक यूडीएफ का उपयोग करना आपके प्रदर्शन को नष्ट कर देगा।
gberger

8
pyspark.sql.functions से import_unixtime, unix_timestamp
Quetzalcoatl

ध्यान दें कि आप यहाँ एक जावा तिथि प्रारूप संदर्भ पा सकते हैं: docs.oracle.com/javase/6/docs/api/java/text/…
RobinL

3
यह भी ध्यान दें कि to_date()प्रारूप तर्क के साथ स्पार्क 2.2+ है। to_date2.2 से पहले अस्तित्व में था, लेकिन प्रारूप विकल्प मौजूद नहीं था
रॉबिनएल

41
from datetime import datetime
from pyspark.sql.functions import col, udf
from pyspark.sql.types import DateType



# Creation of a dummy dataframe:
df1 = sqlContext.createDataFrame([("11/25/1991","11/24/1991","11/30/1991"), 
                            ("11/25/1391","11/24/1992","11/30/1992")], schema=['first', 'second', 'third'])

# Setting an user define function:
# This function converts the string cell into a date:
func =  udf (lambda x: datetime.strptime(x, '%m/%d/%Y'), DateType())

df = df1.withColumn('test', func(col('first')))

df.show()

df.printSchema()

यहाँ उत्पादन है:

+----------+----------+----------+----------+
|     first|    second|     third|      test|
+----------+----------+----------+----------+
|11/25/1991|11/24/1991|11/30/1991|1991-01-25|
|11/25/1391|11/24/1992|11/30/1992|1391-01-17|
+----------+----------+----------+----------+

root
 |-- first: string (nullable = true)
 |-- second: string (nullable = true)
 |-- third: string (nullable = true)
 |-- test: date (nullable = true)

6
udfयहां आवश्यक नहीं होना चाहिए, लेकिन इसे संभालने के लिए निर्मित इन्स अत्याचारी हैं। यही अब मैं भी करूंगा।
जेफ

3
परीक्षण कॉलम में दिनांक पहले कॉलम से मेल क्यों नहीं खाते? हाँ, अब यह तारीख प्रकार का है, लेकिन दिन और महीने मेल नहीं खाते। क्या कोई कारण है?
जेनक्स

1
परीक्षण तारीख के लिए गलत मान देता है। यह सही उत्तर नहीं है।
शेहिरार

1
यूडीएफ के साथ कोई भी समाधान एक उत्तर नहीं है, मुश्किल से एक समाधान। मुझे नहीं लगता कि, PSF और .transform () के संयोजन से आपके द्वारा किए जाने वाले कई उपयोग के मामले हैं।
सम्मन c

28

स्ट्रैपटाइम () दृष्टिकोण मेरे लिए काम नहीं करता है। मुझे कास्ट का उपयोग करके एक और क्लीनर समाधान प्राप्त होता है:

from pyspark.sql.types import DateType
spark_df1 = spark_df.withColumn("record_date",spark_df['order_submitted_date'].cast(DateType()))
#below is the result
spark_df1.select('order_submitted_date','record_date').show(10,False)

+---------------------+-----------+
|order_submitted_date |record_date|
+---------------------+-----------+
|2015-08-19 12:54:16.0|2015-08-19 |
|2016-04-14 13:55:50.0|2016-04-14 |
|2013-10-11 18:23:36.0|2013-10-11 |
|2015-08-19 20:18:55.0|2015-08-19 |
|2015-08-20 12:07:40.0|2015-08-20 |
|2013-10-11 21:24:12.0|2013-10-11 |
|2013-10-11 23:29:28.0|2013-10-11 |
|2015-08-20 16:59:35.0|2015-08-20 |
|2015-08-20 17:32:03.0|2015-08-20 |
|2016-04-13 16:56:21.0|2016-04-13 |

7
धन्यवाद, इस दृष्टिकोण ने मेरे लिए काम किया! मामले में अगर कोई 2008-08-01T14:45:37Zतारीख के बजाय टाइमस्टैम्प की तरह एक स्ट्रिंग बदलना चाहता है , तो अच्छा df = df.withColumn("CreationDate",df['CreationDate'].cast(TimestampType()))काम करता है ... (स्पार्क 2.2.0)
गौरव

1
मैंने AWS Glue pyspark से कई के बीच इस विकल्प की कोशिश की, आकर्षण की तरह काम करता है!
अभि

11

स्वीकार किए गए उत्तर के अद्यतन में आप to_dateफ़ंक्शन के लिए उदाहरण नहीं देखते हैं , इसलिए इसका उपयोग करने वाला एक और समाधान होगा:

from pyspark.sql import functions as F

df = df.withColumn(
            'new_date',
                F.to_date(
                    F.unix_timestamp('STRINGCOLUMN', 'MM-dd-yyyy').cast('timestamp')))

1
एक सरल to_date करना () काम नहीं करता है, यह सही उत्तर है
स्की_सक्वा

6

संभवत: इतने सारे उत्तर मेरे कोड को साझा करने के लिए इतने सोच-विचार के नहीं हैं जो किसी की मदद कर सकते हैं

from pyspark.sql import SparkSession
from pyspark.sql.functions import to_date

spark = SparkSession.builder.appName("Python Spark SQL basic example")\
    .config("spark.some.config.option", "some-value").getOrCreate()


df = spark.createDataFrame([('2019-06-22',)], ['t'])
df1 = df.select(to_date(df.t, 'yyyy-MM-dd').alias('dt'))
print df1
print df1.show()

उत्पादन

DataFrame[dt: date]
+----------+
|        dt|
+----------+
|2019-06-22|
+----------+

उपरोक्त कोड को डेट में कनवर्ट करने के लिए यदि आप डेटाइम में कनवर्ट करना चाहते हैं तो to_timestamp का उपयोग करें। अगर आपको कोई संदेह हो तो मुझे बताएं।


1

इसे इस्तेमाल करे:

df = spark.createDataFrame([('2018-07-27 10:30:00',)], ['Date_col'])
df.select(from_unixtime(unix_timestamp(df.Date_col, 'yyyy-MM-dd HH:mm:ss')).alias('dt_col'))
df.show()
+-------------------+  
|           Date_col|  
+-------------------+  
|2018-07-27 10:30:00|  
+-------------------+  

7
आप इस बात पर विस्तार से विचार कर सकते हैं कि पहले से ही प्रदान की गई और स्वीकार की गई बातों पर आपका उत्तर कैसे सुधरता है।
chb
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.