我正在尝试使用
win32com
库从共享邮箱下载 Outlook 电子邮件。
我的代码如下:
import win32com.client
import win32com
import pandas as pd
from unidecode import unidecode
import datetime
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
folder = outlook.Folders.Item("My Shared Mailbox Name")
inbox = folder.Folders.Item("Inbox")
msg = inbox.Items
subject = []
body = []
sender = []
sendermail = []
senttime = []
for message in msg:
subject.append(message.Subject)
body.append(message.Body)
sender.append(unidecode(message.SenderName))
sendermail.append(unidecode(message.SenderEmailAddress))
senttime.append(message.SentOn)
maildata = pd.DataFrame({'Subject':subject,'Mail Body':body, 'Sender Email Address': sendermail, 'Sender Name': sender, 'Sent Time': senttime})
当我尝试将列表转换为 DataFrame 时,错误发生在最后一行。
我收到以下错误:
AttributeError: 'pywintypes.datetime' object has no attribute 'nanosecond'
时间以与我习惯的格式不同的格式提取:
pywintypes.datetime(2020, 11, 24, 14, 59, 9, tzinfo=TimeZoneInfo('GMT Standard Time', True))
由于我使用的是
win32com
库,时间是以 pywintypes.datetime
格式提取的,我无法将其转换为可以添加到 DataFrame 的格式。
我环顾四周,似乎 win32com 库的文档不太好。
我确实找到了 Tim Golden 的 Python 东西 和一些像 this one 这样的线程,但没有解决问题。我确信它就在我眼前,但我无法将 2 和 2 放在一起。
如果有人能指出我如何转换的正确方向,我将不胜感激。
我知道这只是一个解决方法,但您可以将 pywintypes.datetime 转换为字符串(并切掉多余的尾随字符),然后再将其转换为 pandas 日期时间。
message = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI").GetDefaultFolder(6).Items.GetLast()
pd.to_datetime(str(message.senton)[:-6])
看来时区造成了问题。
key_time_var = 'Sent Time' ## The column containing the datetime data
df[key_time_var] = df[key_time_var].dt.tz_convert(None)
这样的东西可以删除时区,然后它应该可以工作
我遇到了完全相同的问题。 我的解决方案如下;
d = mail.receivedtime.date()
d 将类似于“datetime.date(2016, 4, 6)”
还可以获得
t = mail.receivedtime.time()
t 将类似于“datetime.time(23, 15, 13)”
你可以这样组合它们: newdate = datetime.datetime.combine(d,t)
然后你就可以得到你想要的了!
我相信这对您来说是迟到的答案,但我确实希望这对面临同样问题的其他人有所帮助!