Группировать данные по неделям - PullRequest
1 голос
/ 06 мая 2020

У меня есть данные следующего вида. Я хочу подсчитать количество повторов по неделям (т. Е. Сгруппировать по неделям).

"CaseNumber"    "StartDate"             "PatAge"    "CallerZip" 
"a"             "7/4/2017 11:21:00 PM"  "10"         "12345"
"b"             "7/5/2017 3:38:03 PM"   "10"        "12245"
"c"             "7/15/2017 3:38:03 PM"  "10"        "12245"

Я могу преобразовать этот файл в следующую форму в другой программе, но я хочу знать, есть ли способ сделать это внутри gnuplot.

 Week     Count
  1         2
  2         1

Этот вопрос предполагает, что было бы проще преобразовать (а затем построить график) в другой программе. Мой вопрос отличается от этого , потому что я не могу получить неделю, усекая "StartDate"

Ответы [ 2 ]

2 голосов
/ 06 мая 2020

Gnuplot имеет формат времени% W (см. help time_specifier)

  %W           week of the year (week starts on Monday)

Вы можете использовать это, чтобы читать в ваших датах, используя strptime () для преобразования из строки в числовые секунды, а затем используя strftime ( ) на go назад с секунд на неделю #. Чтобы увидеть, как это работает, попробуйте эту последовательность команд

  date1 = "7/15/2017 3:38:03 PM"
  s1 = strptime("%m/%d/%Y", date1)
  print s1
         1500076800.0
  week = strftime("%W", s1)
  print week
         28

Функция ввода timecolumn (столбец, формат) работает так же, как strptime, за исключением того, что она читает из столбца входных данных, а не из строковой переменной . Чтобы объединить все это в единую оценку при чтении файла данных, проще всего определить функцию. Я покажу, как использовать эту функцию, чтобы просто построить номер недели и предоставить вам возможность использовать номер недели для чего-то другого, как вы хотите

  weekno(column) = int(strftime("%W", timecolumn(column,"\"%m/%d/%Y")))

  plot "file" skip 1 using 0:(weekno(2)) with points

Примечания:

  • Формат времени в определении weekno () содержит экранированные двойные кавычки, потому что ваш формат данных имеет кавычки вокруг строки даты.
  • skip 1 - это способ игнорировать комментарии заголовка в первой строке данных
  • На фрагменте графика ниже вы можете видеть, что функция возвращает неделю 27 для ваших первых двух дат и неделю 28 для третьей даты.

enter image description here

1 голос
/ 06 мая 2020

Я понял ваш вопрос, что вы в основном хотите создать гистограмму вхождений с интервалом биннинга в неделю. Вы можете сделать это, используя smooth freq. Проверить help smooth. Интервал объединения будет составлять одну неделю или 3600*24*7 секунды. Я немного изменил ваш формат времени. Этот 12-часовой формат с AM/PM "всегда" создает проблемы и не может быть прочитан gnuplot (пока, но в одной из следующих версий. См. Комментарий здесь: gnuplot: как преобразовать 12-часовой формат времени в 24-часовой) формат? ).

Код:

### count occurrences by week
reset session

myTimeFmt = '"%m/%d/%Y %H:%M:%S"'
StartDate = '"01/01/2017 00:00:00"'
EndDate =   '"12/31/2017 23:59:59"'

# create some test data
# function for creating a random date between two dates
t(date_str) = strptime(myTimeFmt, date_str)
Random_Date(d0,d1) = strftime(myTimeFmt,rand(0)*(t(d1)-t(d0)) + t(d0))
Alphabet = "abcdedfghijklmnopqrstuvwxyz"
set print $Data
    do for [i=1:200] {
        rand26 = int(rand(0)*26)+1
        RandomChar = Alphabet[rand26:rand26]
        print sprintf('"%s" %s "%d" "%d"',RandomChar,Random_Date(StartDate,EndDate), \
        int(rand(0)*100)+1, int(rand(0)*9e6)+1e6)
    }
set print
# print $Data   # uncomment if you want to see the random data

set style fill solid 1.0
set boxwidth 0.7

set xlabel "Weeks after start date"
set xtics out
set ylabel "Occurrences per week"
set ytics out

# binning for histogram
bin(n) = floor((timecolumn(n,myTimeFmt)-strptime(myTimeFmt,StartDate))/3600/24/7)+1

# either print a table or directly plot the result
set table $Occurrences
    plot $Data u (bin(2)) smooth freq
unset table
print $Occurrences

plot $Data u (bin(2)) smooth freq w boxes notitle
### end of code

Результат:

enter image description here

...