用谷歌日历查找活动的日期?

2024-10-03 15:33:57 发布

您现在位置:Python中文网/ 问答频道 /正文

谷歌日历有没有办法简单地给我提供一个事件发生的星期几?例如,如果我检索一个日期范围内的事件列表,如下所示:

events = service.events().list(calendarId='primary', timeMin='2012-12-24T00:00:00Z',
 timeMax='2012-12-30T23:59:59Z').execute()

有什么方法可以在列表中查找某个特定的事件并找出它是哪一天发生的吗?现在,我正在使用一个笨拙的黑客攻击,涉及Google日历API中的“date”和“dateTime”,并结合Python的Calendar模块:

^{pr2}$

createDayName函数很简单:

def createDayName(dayNum):
    '''
    Takes as input a number generated from calendar.weekday and outputs the weekday name
    that is associated with that number.
    '''
    dayNameList = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
    return dayNameList[dayNum]

当然有一种不那么麻烦的方法吗?我也会遇到一些严重的问题,比如,星期四到星期六。我意识到我可以做一些荒谬的数学来划分时间,但是对于这样一个简单的操作,肯定有更好的方法。在


Tags: 方法number列表thatservice事件eventslist
1条回答
网友
1楼 · 发布于 2024-10-03 15:33:57

据我所知,在CalendarAPI中没有直接获取事件日期的方法。如果结果的日期格式与参数(2012-12-24T00:00:00Z)中的格式相同,则可以将字符串格式与datetime模块结合使用。在这里,%A是字符串格式参数,它返回datetime对象的星期几,该对象是通过在字符串上运行strptime并使用相应格式定义的:

In [1]: from datetime import datetime

In [2]: s = '2012-12-24T00:00:00Z'

In [3]: d = datetime.strptime(s, '%Y-%m-%dT%H:%M:%SZ')

In [4]: '{0:%A}'.format(d)
Out[4]: 'Monday'

作为函数:

^{pr2}$

在此基础上,如果您需要处理多天事件,可以尝试这样的方法,其中主要部分涉及timedelta并迭代两个事件之间的天数(注意,这有点武断,但希望提供一个有用的示例):

from datetime import datetime, timedelta

# This structure will allow us to append to our dictionary without
# there needing to be a key first (comes in handy)
from collections import defaultdict


def days_in_range(start, end, daysDict):
    # Convert your start/end dates
    start_d = datetime.strptime(start, '%Y-%m-%dT%H:%M:%SZ')
    end_d = datetime.strptime(end, '%Y-%m-%dT%H:%M:%SZ')

    # Now iterate over the days between those two dates, adding
    # an arbitrary value to the 'day' key of our dict
    for i in range((end_d - start_d).days + 1):
        day_name = '{0:%A}'.format(start_d + timedelta(days=i))
        daysDict[day_name].append(i)
    return daysDict


# Create your dictionary that will have a list as the default value
daysDict = defaultdict(list)

start = '2012-12-24T00:00:00Z'
end = '2012-12-30T23:59:59Z'

# I would probably reevaluate this part, but the reason for
# passing the dictionary itself to the function is so that
# it can better fit into situations where you have multiple events
# (although a class structure may be well-suited for this, but
# that may be overcomplicating things a bit :) )
daysDict = days_in_range(start, end, daysDict)

for day, value in daysDict.iteritems():
  print day, value

这将打印以下内容(由于词典本身是无序的,因此它可能对您有所不同):

Monday [0]
Tuesday [1]
Friday [4]
Wednesday [2]
Thursday [3]
Sunday [6]
Saturday [5]

相关问题 更多 >