Формат timedelta для строкового представления

args = getResolvedOptions(sys.argv, ['JOB_NAME','source_db','source_table','count','dest_folder']) 
sc = SparkContext() 
glueContext = GlueContext(sc) 
spark = glueContext.spark_session 
job = Job(glueContext) 
job.init(args['JOB_NAME'], args) 
df_new = glueContext.create_dynamic_frame.from_catalog(database = args['source_db'], table_name = args['source_table'], transformation_ctx = "sample_data") 
df_0 = df_new.toDF() 
df_0.registerTempTable("spark_dataframe") 
new_data = spark.sql("Select * from spark_dataframe") 
sample = new_data.limit(args['count'])
sample.repartition(1).write.format('csv').options(delimiter=',',header=True).save("s3://"+ args['dest_folder'] +"/")
job.commit()

I am getting error for line 
sample = new_data.limit(args['count'])

error: 
py4j.Py4JException: Method limit([class java.lang.String]) does not exist 

but the argument passed is not a string.
243
задан martineau 26 June 2019 в 11:16
поделиться

7 ответов

Спасибо все для Вашей справки. Я взял многие Ваши идеи и соединил их, сообщил мне то, что Вы думаете.

я добавил два метода к классу как это:

def hours(self):
    retval = ""
    if self.totalTime:
        hoursfloat = self.totalTime.seconds / 3600
        retval = round(hoursfloat)
    return retval

def minutes(self):
    retval = ""
    if self.totalTime:
        minutesfloat = self.totalTime.seconds / 60
        hoursAsMinutes = self.hours() * 60
        retval = round(minutesfloat - hoursAsMinutes)
    return retval

В моем django я использовал это (сумма является объектом, и это находится в словаре):

<td>{{ sum.0 }}</td>    
<td>{{ sum.1.hours|stringformat:"d" }}:{{ sum.1.minutes|stringformat:"#02.0d" }}</td>
-9
ответ дан mawcs 23 November 2019 в 03:10
поделиться

Можно просто преобразовать timedelta в строку с ул. (). Вот пример:

import datetime
start = datetime.datetime(2009,2,10,14,00)
end   = datetime.datetime(2009,2,10,16,00)
delta = end-start
print(str(delta))
# prints 2:00:00
201
ответ дан Martijn Pieters 23 November 2019 в 03:10
поделиться

Пример следующего Joe оценивает выше, я использовал бы арифметический оператор модуля, таким образом:

td = datetime.timedelta(hours=10.56)
td_str = "%d:%d" % (td.seconds/3600, td.seconds%3600/60)

Примечание, которое целочисленное деление в Python округляет в меньшую сторону по умолчанию; если Вы хотите быть более явными, используйте math.floor () или math.ceil () как соответствующий.

7
ответ дан UltraNurd 23 November 2019 в 03:10
поделиться
>>> str(datetime.timedelta(hours=10.56))
10:33:36

>>> td = datetime.timedelta(hours=10.505) # any timedelta object
>>> ':'.join(str(td).split(':')[:2])
10:30

Передача эти timedelta объект к эти str() вызовы функции то же, форматирующее код используемый, если мы просто тип print td. Так как Вы не хотите секунды, мы можем разделить строку двоеточиями (3 части) и отложить ее только вместе с первыми 2 частями.

56
ответ дан joeforker 23 November 2019 в 03:10
поделиться

Как Вы знаете, можно получить total_seconds от объекта timedelta путем доступа эти .seconds атрибут.

Python обеспечивает встроенную функцию divmod(), который допускает:

s = 13420
hours, remainder = divmod(s, 3600)
minutes, seconds = divmod(remainder, 60)
print '{:02}:{:02}:{:02}'.format(int(hours), int(minutes), int(seconds))
# result: 03:43:40

или можно преобразовать в часы и остаток при помощи комбинации модуля и вычитания:

# arbitrary number of seconds
s = 13420
# hours
hours = s // 3600 
# remaining seconds
s = s - (hours * 3600)
# minutes
minutes = s // 60
# remaining seconds
seconds = s - (minutes * 60)
# total time
print '{:02}:{:02}:{:02}'.format(int(hours), int(minutes), int(seconds))
# result: 03:43:40
166
ответ дан Mickey Perlstein 23 November 2019 в 03:10
поделиться

Прямой шаблон фильтрует для этой проблемы. Интервал встроенной функции () никогда не окружает. Струны фа (т.е. f'') требуют python 3.6.

@app_template_filter()
def diffTime(end, start):
    diff = (end - start).total_seconds()
    d = int(diff / 86400)
    h = int((diff - (d * 86400)) / 3600)
    m = int((diff - (d * 86400 + h * 3600)) / 60)
    s = int((diff - (d * 86400 + h * 3600 + m *60)))
    if d > 0:
        fdiff = f'{d}d {h}h {m}m {s}s'
    elif h > 0:
        fdiff = f'{h}h {m}m {s}s'
    elif m > 0:
        fdiff = f'{m}m {s}s'
    else:
        fdiff = f'{s}s'
    return fdiff
0
ответ дан 23 November 2019 в 03:10
поделиться

My datetime.timedelta objects went greater than a day. So here is a further problem. All the discussion above assumes less than a day. A timedelta is actually a tuple of days, seconds and microseconds. The above discussion should use td.seconds as joe did, but if you have days it is NOT included in the seconds value.

I am getting a span of time between 2 datetimes and printing days and hours.

span = currentdt - previousdt
print '%d,%d\n' % (span.days,span.seconds/3600)
13
ответ дан 23 November 2019 в 03:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: