Python 如何将数据帧时间戳与.ics文件日期进行比较
我有一个包含一列时间戳的数据帧:Python 如何将数据帧时间戳与.ics文件日期进行比较,python,pandas,dataframe,icalendar,Python,Pandas,Dataframe,Icalendar,我有一个包含一列时间戳的数据帧: Timestamp 0 2017-11-09 14:55:29 1 2017-11-09 14:58:29 2 2017-11-09 15:01:29 我还有一个包含假日日历的.ics文件,我已经将它下载到我的硬盘上(完整的日历在这里: 示例条目如下所示: BEGIN:VEVENT DTSTAMP:20180712T151328Z SUMMARY:Eerste Paasdag (Easter Sunday) UID:201807
Timestamp
0 2017-11-09 14:55:29
1 2017-11-09 14:58:29
2 2017-11-09 15:01:29
我还有一个包含假日日历的.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旁边创建一个二进制列。如果时间戳日期对应于类别为“公共假日”的日期,则称为“假日”的时间戳显示为1。这个问题有点类似,但我不理解json或walk部分:
到目前为止,我已经尝试过了,但我对这一点非常陌生,所以可能是完全错误的:
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
此代码从web地址读取ics文件并从中提取所有事件。从dataframe df,代码遍历TimeLine中的所有值并检查events对象中的事件日期。如果任何事件日期与TimeLine匹配,则检查事件类别,并根据类别设置holidayCh值选中列表。在代码末尾,列表已分配给相应的dataframe列 请让我知道这是否有用。谢谢
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)
请附上一些您在更新代码之前尝试过的代码,尽管我不认为我理解否决票?我明确表示我不理解如何编写此代码,并包含所有必需的信息?我在最后一行df=df.assign(Holiday=holidayCheck)上收到一个错误-ValueError:值的长度与索引的长度不匹配请检查dataframe df和holidayCheck列表的长度dataframe为[125250,9]然而holidayCheck列表只有len=1410。不确定为什么它没有在整个df.Timstamp列中运行?代码中有一些缩进错误。更正了它。请检查。好的,现在运行它了,谢谢。但是,我认为它工作不正常;例如,当我搜索圣诞节时间戳(12-25)时,则假日列的读数为0。
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)