我正试图使用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内容和一些类似的线程,但这些线程并没有解决问题。我确信它就在我眼前,我无法将2和2放在一起。
如果有人能为我指明如何皈依的正确方向,我将不胜感激。
我知道这只是一个变通方法,但在将pywintypes.datetime转换为pandas datetime之前,您可以将其转换为字符串(并去掉多余的尾随字符(。
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)
然后你就可以得到你想要的了!
我相信这对你来说是一个迟来的答案,但我确实希望它能对其他面临同样问题的人有所帮助!