将 pywintypes.datetime 转换为 Pandas 数据框

问题描述 投票:0回答:3

我正在尝试使用

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 放在一起。

如果有人能指出我如何转换的正确方向,我将不胜感激。

python pandas outlook pywin32 win32com
3个回答
1
投票

我知道这只是一个解决方法,但您可以将 pywintypes.datetime 转换为字符串(并切掉多余的尾随字符),然后再将其转换为 pandas 日期时间。

message = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI").GetDefaultFolder(6).Items.GetLast()
pd.to_datetime(str(message.senton)[:-6])

1
投票

看来时区造成了问题。

key_time_var = 'Sent Time' ## The column containing the datetime data
df[key_time_var] = df[key_time_var].dt.tz_convert(None)

这样的东西可以删除时区,然后它应该可以工作


0
投票

我遇到了完全相同的问题。 我的解决方案如下;

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)

然后你就可以得到你想要的了!

我相信这对您来说是迟到的答案,但我确实希望这对面临同样问题的其他人有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.