Как сравнить временные метки панд DataFrame с датами файла .ics - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть фрейм данных, содержащий столбец меток времени:

    Timestamp   
0   2017-11-09 14:55:29 
1   2017-11-09 14:58:29 
2   2017-11-09 15:01:29 

У меня также есть этот файл .ics, содержащий календарь праздников, который я скачал на свой диск (полный календарь здесь: https://raw.githubusercontent.com/PanderMusubi/dutch-holidays/master/DutchHolidays.ics

Пример записи выглядит так:

BEGIN:VEVENT
DTSTAMP:20180712T151328Z
SUMMARY:Eerste Paasdag (Easter Sunday)
UID:20180712T151328Z-17127-0077-en@katana
DTSTART;VALUE=DATE:20180401
DTEND;VALUE=DATE:20180402
ATTACH:https://nl.wikipedia.org/wiki/Eerste_Paasdag
CATEGORIES:Public Holiday
TRANSP:TRANSPARENT
END:VEVENT

Я хотел бы создать двоичный столбец рядом с df.Timestamp с именем 'Holiday', показывающий 1, если дата Timestamp соответствует дате, когда CATEGORIES: Public Holiday. Этот вопрос чем-то похож, но я не понимаю частей json или walk: анализирует даты с помощью icalendar и сравнивает с python datetime

Я пробовал это до сих пор, но я очень новичок в этом, так что это, вероятно, совершенно неправильно:

import icalendar
calendar = icalendar.Calendar.from_ical('/Users/dpezim/Desktop/Python/DutchHolidays.ics')

for i in df.Timestamp:
    for event in calendar.walk('VEVENT'):
        if event['DTSTART'].dt <= i <= event['DTEND'].dt:
            df = df.assign(Holiday=1)
        else: 
            df = df.assign(Holiday=0)
return df

Я получаю эту ошибку:

ValueError: Content line could not be parsed into parts: '/Users/dpezim/Desktop/Python/DutchHolidays.ics': /Users/dpezim/Desktop/Python/DutchHolidays.ics

1 Ответ

0 голосов
/ 07 ноября 2018

Этот код читает файл ics с веб-адреса и извлекает из него все события. От фрейма данных df код пересекает все значения в TimeLine и проверяет даты событий в объекте событий. Если какая-либо дата события совпадает с временной шкалой, она проверяет категории события и на основании категории устанавливает значение списка holidayCheck. В конце кода список был присвоен соответствующему столбцу данных.

Пожалуйста, дайте мне знать, помогает ли это. Спасибо.

import numpy as np
import pandas as pd
from urllib.request import urlopen
import datetime as dt
import ics

url = 'https://raw.githubusercontent.com/PanderMusubi/dutch-holidays/master/DutchHolidays.ics'


icsFile = c = ics.Calendar(urlopen(url).read().decode('iso-8859-1'))
holidayCheck = []
events = icsFile.events

for _datetime in df.Timestamp:

    dfDate = int(_datetime.strftime('%Y%m%d'))

    check = False
    for event in events:
        eventDate = int(event.begin.strftime('%Y%m%d'))

        if dfDate == eventDate:
            categories = next(iter(event.categories))
            if categories == 'Public Holiday':
                holidayCheck.append(1)
            else:
                holidayCheck.append(0)
            check = True
            break
        else:
            check = False

    if check == False:
        holidayCheck.append(0)

df = df.assign(Holiday = holidayCheck)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...