Проблема : Установите функцию, которая установит YTD для пользовательского отчета.
Ожидаемый результат : Это должен быть диапазон времени YTD (с понедельника по понедельник, воскресеньедо воскресенья).Затем разделите его на меньшие временные диапазоны.Примечание. Эти временные диапазоны необходимо будет разделить и интегрировать в основной отчет Google Analytics.Диапазон времени должен быть достаточно мал, чтобы избежать выборки.
Диапазон времени заканчивается в конце месяца, который только что закончился, т. Е .: на момент написания этой статьи мы находимся в декабре, поэтому это будет ноябрь.
Я нашел несколько отличных ответов об isocalendar, который, на мой взгляд, является типом календаря, который соответствует всему «YTD».Я нашел следующие ресурсы полезными и использовал то, что было полезно для меня:
Какой лучший способ найти обратное для datetime.isocalendar ()? => Отличная функция от isoweek, которая помогла мнепонять это.+ Я смотрел на модули календаря / даты и времени.
Пока что у меня нет ожидаемого результата:
Между 2018 и 2017 годами есть совпадение, хотя не должно быть, если вы ссылаетесь накалендари (https://www.epochconverter.com/weeks/2018). (2018-01-01) подсчитываются как с начала года с 2017 года, так и с начала года 2018 года. Если я использую с начала года 2018 с начала года, например, у меня снова будет последний диапазон времени, подсчитанный в обоих диапазонах времени
Я подозреваю, что в самой логике есть изъян, но я не смог ее разгадать.
Это то, что у меня есть на 2017 год:
[[('2017-01-02', '2017-01-07'), ('2017-01-08', '2017-01-13'), ('2017-01-14', '2017-01-19'), ('2017-01-20', '2017-01-25'), ('2017-01-26', '2017-01-31'), ('2017-02-01', '2017-02-01')], [('2017-02-02', '2017-02-07'), ('2017-02-08', '2017-02-13'), ('2017-02-14', '2017-02-19'), ('2017-02-20', '2017-02-25'), ('2017-02-26', '2017-03-01')], [('2017-03-02', '2017-03-07'), ('2017-03-08', '2017-03-13'), ('2017-03-14', '2017-03-19'), ('2017-03-20', '2017-03-25'), ('2017-03-26', '2017-03-31'), ('2017-04-01', '2017-04-01')], [('2017-04-02', '2017-04-07'), ('2017-04-08', '2017-04-13'), ('2017-04-14', '2017-04-19'), ('2017-04-20', '2017-04-25'), ('2017-04-26', '2017-05-01')], [('2017-05-02', '2017-05-07'), ('2017-05-08', '2017-05-13'), ('2017-05-14', '2017-05-19'), ('2017-05-20', '2017-05-25'), ('2017-05-26', '2017-05-31'), ('2017-06-01', '2017-06-01')], [('2017-06-02', '2017-06-07'), ('2017-06-08', '2017-06-13'), ('2017-06-14', '2017-06-19'), ('2017-06-20', '2017-06-25'), ('2017-06-26', '2017-07-01')], [('2017-07-02', '2017-07-07'), ('2017-07-08', '2017-07-13'), ('2017-07-14', '2017-07-19'), ('2017-07-20', '2017-07-25'), ('2017-07-26', '2017-07-31'), ('2017-08-01', '2017-08-01')], [('2017-08-02', '2017-08-07'), ('2017-08-08', '2017-08-13'), ('2017-08-14', '2017-08-19'), ('2017-08-20', '2017-08-25'), ('2017-08-26', '2017-08-31'), ('2017-09-01', '2017-09-01')], [('2017-09-02', '2017-09-07'), ('2017-09-08', '2017-09-13'), ('2017-09-14', '2017-09-19'), ('2017-09-20', '2017-09-25'), ('2017-09-26', '2017-10-01')], [('2017-10-02', '2017-10-07'), ('2017-10-08', '2017-10-13'), ('2017-10-14', '2017-10-19'), ('2017-10-20', '2017-10-25'), ('2017-10-26', '2017-10-31'), ('2017-11-01', '2017-11-01')], [('2017-11-02', '2017-11-07'), ('2017-11-08', '2017-11-13'), ('2017-11-14', '2017-11-19'), ('2017-11-20', '2017-11-25'), ('2017-11-26', '2017-12-01')], [('2017-12-02', '2017-12-07'), ('2017-12-08', '2017-12-13'), ('2017-12-14', '2017-12-19'), ('2017-12-20', '2017-12-25'), ('2017-12-26', '2017-12-31'), ('2018-01-01', '2018-01-01')]]
Это то, что у меня есть для 2018 года:
[[('2018-01-01', '2018-01-06'), ('2018-01-07', '2018-01-12'), ('2018-01-13', '2018-01-18'), ('2018-01-19', '2018-01-24'), ('2018-01-25', '2018-01-30'), ('2018-01-31', '2018-01-31')], [('2018-02-01', '2018-02-06'), ('2018-02-07', '2018-02-12'), ('2018-02-13', '2018-02-18'), ('2018-02-19', '2018-02-24'), ('2018-02-25', '2018-02-28')], [('2018-03-01', '2018-03-06'), ('2018-03-07', '2018-03-12'), ('2018-03-13', '2018-03-18'), ('2018-03-19', '2018-03-24'), ('2018-03-25', '2018-03-30'), ('2018-03-31', '2018-03-31')], [('2018-04-01', '2018-04-06'), ('2018-04-07', '2018-04-12'), ('2018-04-13', '2018-04-18'), ('2018-04-19', '2018-04-24'), ('2018-04-25', '2018-04-30')], [('2018-05-01', '2018-05-06'), ('2018-05-07', '2018-05-12'), ('2018-05-13', '2018-05-18'), ('2018-05-19', '2018-05-24'), ('2018-05-25', '2018-05-30'), ('2018-05-31', '2018-05-31')], [('2018-06-01', '2018-06-06'), ('2018-06-07', '2018-06-12'), ('2018-06-13', '2018-06-18'), ('2018-06-19', '2018-06-24'), ('2018-06-25', '2018-06-30')], [('2018-07-01', '2018-07-06'), ('2018-07-07', '2018-07-12'), ('2018-07-13', '2018-07-18'), ('2018-07-19', '2018-07-24'), ('2018-07-25', '2018-07-30'), ('2018-07-31', '2018-07-31')], [('2018-08-01', '2018-08-06'), ('2018-08-07', '2018-08-12'), ('2018-08-13', '2018-08-18'), ('2018-08-19', '2018-08-24'), ('2018-08-25', '2018-08-30'), ('2018-08-31', '2018-08-31')], [('2018-09-01', '2018-09-06'), ('2018-09-07', '2018-09-12'), ('2018-09-13', '2018-09-18'), ('2018-09-19', '2018-09-24'), ('2018-09-25', '2018-09-30')], [('2018-10-01', '2018-10-06'), ('2018-10-07', '2018-10-12'), ('2018-10-13', '2018-10-18'), ('2018-10-19', '2018-10-24'), ('2018-10-25', '2018-10-30'), ('2018-10-31', '2018-10-31')], [('2018-11-01', '2018-11-06'), ('2018-11-07', '2018-11-12'), ('2018-11-13', '2018-11-18'), ('2018-11-19', '2018-11-24'), ('2018-11-25', '2018-11-30')]]
Если вы продолжаете изменять даты, расхождение усугубляется.
Вот код времени:
import datetime
import time
import calendar
from datetime import date, timedelta
def infer_dates(day=datetime.datetime.today()):
def date_from_isoweek(iso_year, iso_weeknumber, iso_weekday):
"""isoweek shows the week number and weekday """
return datetime.datetime.strptime('{:04d} {:02d} {:d}'.format(iso_year,
iso_weeknumber,
iso_weekday), '%G %V %u')
def get_date_to_date(date_to_transform, year_date=1):
"""This function takes a date and get its equivalent
the year date parameter changes to n years ago.
"""
return date_from_isoweek(date_to_transform.isocalendar()[0] - year_date,
date_to_transform.isocalendar()[1],
date_to_transform.isocalendar()[2])
def last_day_of_month(any_date):
month = any_date.replace(day=28) + datetime.timedelta(days=4)
return month - datetime.timedelta(days=month.day)
def monthly_time(start_date, end_date, start_factor):
#This is to split according to the best time range size to avoid
sampling
if start_factor > end_date.day:
start_factor = end_date.day
end_factor = start_factor - 1
days = end_date.day - start_date.day + 1
n_requests = days // start_factor
remnant = days - (n_requests * start_factor)
monthly_start_dates = [start_date]
while n_requests > 1:
start_date = start_date + timedelta(days=start_factor)
n_requests -= 1
monthly_start_dates.append(start_date)
end_dates = [start_date + timedelta(days=end_factor) for start_date in monthly_start_dates]
monthly_dates = list(zip(monthly_start_dates, end_dates))
if remnant != 0:
remnant_dates = (end_dates[len(end_dates) - 1] + timedelta(days=1), end_date)
monthly_dates.append(remnant_dates)
dates_sets = [(dates[0].strftime("%Y-%m-%d"), dates[1].strftime("%Y-%m-%d"))
for dates in monthly_dates
]
return dates_sets
# cy : current year
# ly : last year
# cm : current month
# lm : last month
#The line below is because I merged several functions together into a
#bigger one to be used in a separate script
today = day
cy_lm = today.replace(month=today.month - 1)
cy_first_days = [date(year=today.year, month=i, day=1)
for i in range(1, today.month)]
cy_last_days = [last_day_of_month(dom) for dom in cy_first_days]
cy_months = list(zip(cy_first_days, cy_last_days))
#I use a dummy full current year to translate the current year into
#the past year to date
cy_dummy_first_days = [date(year=today.year, month=i, day=1)
for i in range(1, 13)]
cy_dummy_last_days = [last_day_of_month(dom) for dom in
cy_dummy_first_days]
cy_dummy_months = list(zip(cy_dummy_first_days, cy_dummy_last_days))
ly_months = [(get_date_to_date(dates[0]).date(),
get_date_to_date(dates[1]).date()) for dates in cy_dummy_months]
###Breaking down each sets of date, starting with cy ###
cy_all_dates = [monthly_time(month[0], month[1], 6)
for month in cy_months]
cy_dummy_all_dates = [monthly_time(month[0], month[1], 6)
for month in cy_dummy_months]
ly_all_dates = [[(get_date_to_date(datetime.datetime.strptime(unit[0], "%Y-%m-%d").date()).strftime("%Y-%m-%d"),
get_date_to_date(datetime.datetime.strptime(unit[1], "%Y-%m-%d").date()).strftime("%Y-%m-%d"))
for unit in month]
for month in cy_dummy_all_dates]
return (cy_all_dates, ly_all_dates)
if __name__ == '__main__':
# cy : current year
# ly : last year
# cm : current month
# lm : last month
print(infer_dates())
Я работаю с Python 3.6. Поэтому у меня нет доступа к последним функциям календаря. Любая подсказка, чтобы направить меня в нужном направлении, приветствуется!