Не нужно dplyr
. Посмотрите на ?as.POSIXlt
df$date<-as.POSIXlt(df$date)
mon<-df$date$mon
yr<-df$date$year
monyr<-as.factor(paste(mon,yr,sep="/"))
df$date<-monyr
Не нужно использовать ggplot2
, но это приятно для такого рода вещей.
c <- ggplot(df, aes(factor(date)))
c + geom_bar()
Если вы хотите увидеть фактические цифры
aggregate(. ~ date,data = df,FUN=length )
df2<-aggregate(. ~ date,data = df,FUN=length )
df2
date value
1 0/98 31
2 0/99 31
3 1/98 28
4 1/99 28
5 10/98 30
6 10/99 30
7 11/97 1
8 11/98 31
9 11/99 31
10 2/98 31
11 2/99 31
12 3/98 30
13 3/99 30
14 4/98 31
15 4/99 31
16 5/98 30
17 5/99 30
18 6/98 31
19 6/99 31
20 7/98 31
21 7/99 31
22 8/98 30
23 8/99 30
24 9/98 31
25 9/99 31
urllib2 библиотека использует объекты OpenerDirector обработать фактическое открытие. К счастью, библиотека Python обеспечивает значения по умолчанию, таким образом, Вы не имеете к. Это - однако, эти объекты OpenerDirector, которые добавляют дополнительные заголовки.
Для наблюдения, что они после того, как запрос был отправлен (так, чтобы можно было зарегистрировать его, например):
req = urllib2.Request(url='http://google.com')
response = urllib2.urlopen(req)
print req.unredirected_hdrs
(produces {'Host': 'google.com', 'User-agent': 'Python-urllib/2.5'} etc)
unredirected_hdrs - то, где OpenerDirectors выводят свои дополнительные заголовки. Просто рассмотрение req.headers
покажет только Ваши собственные заголовки - библиотека оставляет в безопасности для Вас.
, Если необходимо видеть заголовки, прежде чем Вы отправите запрос, необходимо будет разделить OpenerDirector на подклассы для прерывания передачи.
Hope, которая помогает.
РЕДАКТИРОВАНИЕ: Я забыл упоминать, что, как только запрос, как отправлено, req.header_items()
даст Вам список кортежей ВСЕХ заголовков, и с Вашим собственным и с теми добавленными OpenerDirector. Я должен был упомянуть это сначала, так как это - самый простой:-), Извините.
РЕДАКТИРОВАНИЕ 2: После Вашего вопроса о примере для определения Вашего собственного обработчика вот образец, который я придумал. Беспокойство в любом monkeying с цепочкой запроса - то, что мы должны быть уверены, что обработчик безопасен для нескольких запросов, который является, почему мне неудобна просто замена определения putheader на классе HTTPConnection непосредственно.
К сожалению, потому что внутренности HTTPConnection и AbstractHTTPHandler являются очень внутренними, мы должны воспроизвести большую часть кода из библиотеки Python для введения нашего пользовательского поведения. Принятие я не попал впросак ниже и это работает, а также оно сделало за мои 5 минут тестирования, стараться пересмотреть это переопределение при обновлении версии Python к числу пересмотра (т.е.: 2.5.x к 2.5.y или 2.5 к 2,6, и т.д.).
я должен поэтому упомянуть, что нахожусь на Python 2.5.1. Если Вы имеете 2.6 или, особенно, 3.0, Вы, возможно, должны скорректировать это соответственно.
сообщите мне, не работает ли это. У меня есть waaaayyyy слишком много забавы с этим вопросом:
import urllib2
import httplib
import socket
class CustomHTTPConnection(httplib.HTTPConnection):
def __init__(self, *args, **kwargs):
httplib.HTTPConnection.__init__(self, *args, **kwargs)
self.stored_headers = []
def putheader(self, header, value):
self.stored_headers.append((header, value))
httplib.HTTPConnection.putheader(self, header, value)
class HTTPCaptureHeaderHandler(urllib2.AbstractHTTPHandler):
def http_open(self, req):
return self.do_open(CustomHTTPConnection, req)
http_request = urllib2.AbstractHTTPHandler.do_request_
def do_open(self, http_class, req):
# All code here lifted directly from the python library
host = req.get_host()
if not host:
raise URLError('no host given')
h = http_class(host) # will parse host:port
h.set_debuglevel(self._debuglevel)
headers = dict(req.headers)
headers.update(req.unredirected_hdrs)
headers["Connection"] = "close"
headers = dict(
(name.title(), val) for name, val in headers.items())
try:
h.request(req.get_method(), req.get_selector(), req.data, headers)
r = h.getresponse()
except socket.error, err: # XXX what error?
raise urllib2.URLError(err)
r.recv = r.read
fp = socket._fileobject(r, close=True)
resp = urllib2.addinfourl(fp, r.msg, req.get_full_url())
resp.code = r.status
resp.msg = r.reason
# This is the line we're adding
req.all_sent_headers = h.stored_headers
return resp
my_handler = HTTPCaptureHeaderHandler()
opener = urllib2.OpenerDirector()
opener.add_handler(my_handler)
req = urllib2.Request(url='http://www.google.com')
resp = opener.open(req)
print req.all_sent_headers
shows: [('Accept-Encoding', 'identity'), ('Host', 'www.google.com'), ('Connection', 'close'), ('User-Agent', 'Python-urllib/2.5')]
Как насчет чего-то вроде этого:
import urllib2
import httplib
old_putheader = httplib.HTTPConnection.putheader
def putheader(self, header, value):
print header, value
old_putheader(self, header, value)
httplib.HTTPConnection.putheader = putheader
urllib2.urlopen('http://www.google.com')
см. urllib2.py:do_request (строка 1044 (1067)) и urllib2.py:do_open (строка 1073) (строка 293) self.addheaders = [('Агент пользователя', client_version)] (только добавленный 'Агент пользователя')
Это должно отправить значение по умолчанию http заголовки (как определено w3.org ) вместе с теми, Вы определяете. Можно использовать инструмент как WireShark, если требуется видеть их в их полноте.
Редактирование:
, Если требуется зарегистрировать их, можно использовать WinPcap для получения пакетов, отправленных определенными приложениями (в случае, Python). Можно также определить тип пакетов и многих других деталей.
- Джон