2016-08-20 2 views
1

SECOND EDIT:Использование Python для редактирования временных меток в списке? Преобразование POSIX в читаемый формат с использованием функции

Готовый фрагмент для настройки часовых поясов и формата преобразования. См. Правильный ответ ниже для получения подробной информации, приводящей к этому решению.

tzvar = int(input("Enter the number of hours you'd like to add to the timestamp:")) 
tzvarsecs = (tzvar*3600) 
print (tzvarsecs) 

def timestamp_to_str(timestamp): 
    return datetime.fromtimestamp(timestamp).strftime('%H:%M:%S %m/%d/%Y') 

timestamps = soup('span', {'class': '_timestamp js-short-timestamp '}) 
dtinfo = [timestamp["data-time"] for timestamp in timestamps] 
times = map(int, dtinfo) 
adjtimes = [x+tzvarsecs for x in times] 
adjtimesfloat = [float(i) for i in adjtimes] 
dtinfofloat = [float(i) for i in dtinfo] 
finishedtimes = [x for x in map(timestamp_to_str, adjtimesfloat)] 
originaltimes = [x for x in map(timestamp_to_str, dtinfofloat)] 

КОНЕЦ ВТОРОЙ EDIT


EDIT:

Этот код позволяет мне скрести время POSIX из HTML-файла, а затем добавить определенное количество часов, введенных пользователем в оригинале стоимость. Отрицательные числа также будут работать, чтобы вычесть часы. Пользователь будет работать целыми часами, поскольку изменения предназначены специально для настройки часовых поясов.

tzvar = int(input("Enter the number of hours you'd like to add to the timestamp:")) 
tzvarsecs = (tzvar*3600) 
print (tzvarsecs) 

timestamps = soup('span', {'class': '_timestamp js-short-timestamp '}) 
dtinfo = [timestamp["data-time"] for timestamp in timestamps] 
times = map(int, dtinfo) 
adjtimes = [x+tzvarsecs for x in times] 

Все, что осталось, является обратной функцией, подобной предложенной ниже. Как преобразовать каждое время POSIX в список в читаемый формат с помощью функции?

END EDIT



Приведенный ниже код создает файл CSV, содержащий данные соскабливают с сохраненным Twitter HTML-файл.

Twitter преобразует все временные метки в локальное время пользователя в браузере. Я хотел бы иметь возможность ввода для пользователя, чтобы настроить отметки времени на определенное количество часов, чтобы данные для твита отображали местное время твитера.

В настоящее время я очищаю элемент под названием 'title', который является частью каждой постоянной ссылки. Я мог бы так же легко очистить время POSIX от каждого твита.

title="2:29 PM - 28 Sep 2015" 

против

data-time="1443475777" data-time-ms="1443475777000" 

Как отредактировать следующий фрагмент поэтому добавил переменную, вводимую пользователем для каждой метки времени? Мне не нужна помощь с запросом ввода, мне просто нужно знать, как применить его к списку временных меток после того, как вход передан на python.

timestamps = soup('a', {'class': 'tweet-timestamp js-permalink js-nav js-tooltip'}) 
datetime = [timestamp["title"] for timestamp in timestamps] 

Другие вопросы, связанные с этим кодом/проекта.

Fix encoding error with loop in BeautifulSoup4?

Focusing in on specific results while scraping Twitter with Python and Beautiful Soup 4?

Using Python to Scrape Nested Divs and Spans in Twitter?


Полный код.

from bs4 import BeautifulSoup 
import requests 
import sys 
import csv 
import re 
from datetime import datetime 
from pytz import timezone 

url = input("Enter the name of the file to be scraped:") 
with open(url, encoding="utf-8") as infile: 
    soup = BeautifulSoup(infile, "html.parser") 

#url = 'https://twitter.com/search?q=%23bangkokbombing%20since%3A2015-08-10%20until%3A2015-09-30&src=typd&lang=en' 
#headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'} 
#r = requests.get(url, headers=headers) 
#data = r.text.encode('utf-8') 
#soup = BeautifulSoup(data, "html.parser") 

names = soup('strong', {'class': 'fullname js-action-profile-name show-popup-with-id'}) 
usernames = [name.contents for name in names] 

handles = soup('span', {'class': 'username js-action-profile-name'}) 
userhandles = [handle.contents[1].contents[0] for handle in handles] 
athandles = [('@')+abhandle for abhandle in userhandles] 

links = soup('a', {'class': 'tweet-timestamp js-permalink js-nav js-tooltip'}) 
urls = [link["href"] for link in links] 
fullurls = [permalink for permalink in urls] 

timestamps = soup('a', {'class': 'tweet-timestamp js-permalink js-nav js-tooltip'}) 
datetime = [timestamp["title"] for timestamp in timestamps] 

messagetexts = soup('p', {'class': 'TweetTextSize js-tweet-text tweet-text'}) 
messages = [messagetext for messagetext in messagetexts] 

retweets = soup('button', {'class': 'ProfileTweet-actionButtonUndo js-actionButton js-actionRetweet'}) 
retweetcounts = [retweet.contents[3].contents[1].contents[1].string for retweet in retweets] 

favorites = soup('button', {'class': 'ProfileTweet-actionButtonUndo u-linkClean js-actionButton js-actionFavorite'}) 
favcounts = [favorite.contents[3].contents[1].contents[1].string for favorite in favorites] 

images = soup('div', {'class': 'content'}) 
imagelinks = [src.contents[5].img if len(src.contents) > 5 else "No image" for src in images] 

#print (usernames, "\n", "\n", athandles, "\n", "\n", fullurls, "\n", "\n", datetime, "\n", "\n",retweetcounts, "\n", "\n", favcounts, "\n", "\n", messages, "\n", "\n", imagelinks) 

rows = zip(usernames,athandles,fullurls,datetime,retweetcounts,favcounts,messages,imagelinks) 

rownew = list(rows) 

#print (rownew) 

newfile = input("Enter a filename for the table:") + ".csv" 

with open(newfile, 'w', encoding='utf-8') as f: 
    writer = csv.writer(f, delimiter=",") 
    writer.writerow(['Usernames', 'Handles', 'Urls', 'Timestamp', 'Retweets', 'Favorites', 'Message', 'Image Link']) 
    for row in rownew: 
     writer.writerow(row) 

ответ

1

Использование кода в качестве примера, УАК datetime хранить список дат строки. Итак, давайте проанализируем процесс в 3 этапа, просто для понимания.

Пример

>>> datetime = [timestamp["title"] for timestamp in timestamps] 
>>> print(datetime) 
['2:13 AM - 29 Sep 2015', '2:29 PM - 28 Sep 2015', '8:04 AM - 28 Sep 2015'] 

Первый шаг: преобразовать его в Python datetime object.

>>> datetime_obj = datetime.strptime('2:13 AM - 29 Sep 2015', '%H:%M %p - %d %b %Y') 
>>> print(datetime_obj) 
datetime.datetime(2015, 9, 29, 2, 13) 

Второй шаг: преобразования даты и времени объект на третьей стадии Python structured time object

>>> to_time = struct_date.timetuple() 
>>> print(to_time) 
time.struct_time(tm_year=2015, tm_mon=9, tm_mday=29, tm_hour=2, tm_min=13, tm_sec=0, tm_wday=1, tm_yday=272, tm_isdst=-1) 

: новообращенный sturctured объект время time с помощью time.mktime

>>> timestamp = time.mktime(to_time) 
>>> print(timestamp) 
1443503580.0 

Все вместе.

import time 
from datetime import datetime 

... 
def str_to_ts(str_date): 
    return time.mktime(datetime.strptime(str_date, '%H:%M %p - %d %b %Y').timetuple()) 

datetimes = [timestamp["title"] for timestamp in timestamps] 
times = [i for i in map(str_to_ts, datetimes)] 

PS: datetime является плохим выбором для имени переменной. Специально в этом контексте. :-)

Update

Чтобы применить функцию к каждому значению списка:

def add_time(timestamp, hours=0, minutes=0, seconds=0): 
    return timestamp + seconds + (minutes * 60) + (hours * 60 * 60) 

datetimes = [timestamp["title"] for timestamp in timestamps] 
times = [add_time(i, 5, 0, 0) for i in datetimes] 

Update 2

Чтобы преобразовать метку в строку, отформатированную дату:

def timestamp_to_str(timestamp): 
    return datetime.fromtimestamp(timestamp).strftime('%H:%M:%S %m/%d/%Y') 

Пример:

>>> from time import time 
>>> from datetime import datetime 

>>> timestamp_to_str(time()) 
'17:01:47 08/29/2016' 
+0

Я могу так же легко очистить время POSIX от твиттера, как описано выше. Мне не нужно преобразовывать метку времени из одного формата в другой. Мне нужно знать, как добавить определенное количество часов в каждую временную метку в списке. Кажется, что было бы проще использовать формат POSIX. Например, как я могу добавить 17 часов или 61200 секунд для каждого элемента в списке? –

+0

Это (обновление в ответ), что вы имеете в виду? –

+0

Функция 'str_to_ts' противоположна тому, что я искал.Теперь, когда я добавил 61200 секунд в каждое время POSIX, как мне преобразовать его обратно в формат hh: mm: ss MM/DD/YYYY? –

0

Это то, что я имел в виду, но не уверен, если это то, что вы после:

>>> timestamps = ["1:00 PM - 28 Sep 2015", "2:00 PM - 28 Sep 2016", "3:00 PM - 29 Sep 2015"] 
>>> datetime = dict(enumerate(timestamps)) 
>>> datetime 
{0: '1:00 PM - 28 Sep 2015', 
1: '2:00 PM - 28 Sep 2016', 
2: '3:00 PM - 29 Sep 2015'} 
0

Кажется, что вы ищете datetime.timedelta (documentation here). Вы можете конвертировать ваши материалы в datetime.datetime объектов различными способами, например,

timestamp = datetime.datetime.fromtimestamp(1443475777) 

Затем вы можете выполнять арифметические операции над ними с timedelta объектами. A timedelta просто представляет собой изменение во времени. Вы можете построить один с hours аргумент так:

delta = datetime.timedelta(hours=1) 

И тогда timestamp + delta даст вам еще один datetime один час в будущем. Вычитание будет работать также, как и другие произвольные временные интервалы.

Смежные вопросы