繁体   English   中英

ExcelWriter ValueError: Excel 将 df 保存到 Excel 时不支持带时区的日期时间

[英]ExcelWriter ValueError: Excel does not support datetime with timezone when saving df to Excel

我在这个问题上已经有一段时间了。

我将作者设置如下:

writer = pd.ExcelWriter(arquivo+'.xlsx', engine = 'xlsxwriter', options = {'remove_timezone': True})
df.to_excel(writer, header = True, index = True)

此代码位于 s function 内。问题是每次我运行代码时,它都会从数据库中获取信息,其中包含两列 datetime64[ns, UTC] object 和时区信息。 但是当保存到 Excel 的代码运行时,我收到:

ValueError: Excel does not support datetimes with timezones. Please ensure that datetimes are timezone unaware before writing to Excel.

我已经尝试过几种方法,例如“dt.tz_convert”、replace(tzinfo=None) 以及我在这里和周围找到的其他解决方案。

代码在我的个人电脑上运行没有问题,我的同事使用相同的机器规格可以运行代码。 只有在我的机器上它没有。 我已经重新安装了 python 和所有软件包,包括格式化机器什么都没有,错误仍然存在。

xlrd v1.1.0

xlsxwriter v1.0.4

python 3.7.4

pandas v0.25.1

如果有人能对这个问题有所了解,我将不胜感激。

谢谢

你的时间戳是什么格式的?

我只是有一个类似的问题。

我试图将数据框保存到 Excel。 但是我得到了:

错误代码

我检查了我的日期格式,格式为'2019-09-01T00:00:00.000Z'

这是来自pandas.to_datetime的时间戳pandas._libs.tslibs.timestamps.Timestamp

其中包括一个方法date()将日期转换为 excel 可接受的格式"%Y-%m-%d"

所以我的代码是这样的:

#Pseudo
df['date'] = old_dates
df['date'] = df['date'].apply(lambda a: pd.to_datetime(a).date()) 
# .date() removes timezone

...df.to_excel etc.

这应该可以完成工作,在导出到 excel 之前从列中删除时区(使用 tz_localize(None))。

# Check which columns have timezones datetime64[ns, UTC] 
df.dtypes

# Remove timezone from columns
df['date'] = df['date'].dt.tz_localize(None)

# Export to excel
df.to_excel('filename.xlsx')

我发现这种方式更容易,更有活力。 此解决方案您 select 列按类型并应用了所需的转换。

date_columns = df.select_dtypes(include=['datetime64[ns, UTC]']).columns
for date_column in date_columns:
    df[date_column] = df[date_column].dt.date
    
df.to_excel('anbima_feed.xlsx',engine='xlsxwriter')

仅当您需要相应时区中没有时间的日期时,接受的答案才有效。 如果您的时间以 UTC 为纪元,您需要将其转换为 Striftime,然后再转换为 Datetime 以保存时区中的时间。

参考: https://python-forum.io/thread-31300.html

示例:字段 ts 是 UTC 中的时间戳,以 Epoch 为单位,以毫秒为单位。

df['ts']
OUT:
0      1619801902867
1      1619765681594
2      1619712291984
3      1619680298648
4      1619629032109
5      1619593388626
6      1619531314509
7      1619509338368
8      1619449287828
9      1619433411243
10     1619103667781
11     1619078244871
12     1619021782951
13     1618990214111
14     1618931135540
15     1618903774632

然后您需要将其转换为所需的时区:

df['ts'] = pd.to_datetime(df['ts'],unit='ms').dt.tz_localize('utc').dt.tz_convert('Europe/Vatican')
df['ts'] = df['ts'].apply(lambda a: datetime.datetime.strftime(a,"%Y-%m-%d %H:%M:%S"))
df['ts'] = pd.to_datetime(df['ts'])

结果将如下所示:

df['ts']
OUT:
0     2021-04-30 18:58:22
1     2021-04-30 08:54:41
2     2021-04-29 18:04:51
3     2021-04-29 09:11:38
4     2021-04-28 18:57:12
5     2021-04-28 09:03:08
6     2021-04-27 15:48:34
7     2021-04-27 09:42:18
8     2021-04-26 17:01:27
9     2021-04-26 12:36:51
10    2021-04-22 17:01:07
11    2021-04-22 09:57:24
12    2021-04-21 18:16:22
13    2021-04-21 09:30:14
14    2021-04-20 17:05:35
15    2021-04-20 09:29:34

在此之后,xlsxwriter 将接受它并写入 excel 而不会出现错误消息。

Pandas中还有另一种使用UTC参数的方法

import pandas as pd
# Adjust time zone from columns
df['date'] = pd.to_datetime( df['date'], errors='coerce',utc=True)
# Export to excel
df.to_excel('filename.xlsx')

我遇到了同样的问题,做了一些文档搜索,找到了 pandas 的解决方案

以下更改( options={'remove_timezone': True} )对我有用。

exwriter = pd.ExcelWriter(fullpath, engine='xlsxwriter', options={'remove_timezone': True})

如果您对工作表中的值是字符串感到满意,则可以使用以下代码来转换日期时间

date_columns = df.select_dtypes(include=['datetime64[ns, UTC]']).columns
for date_column in date_columns:
    df[date_column] = df[date_column].apply(str)

我有一个类似的问题。 就我而言,日期是索引。 如果其他人遇到这个问题(通常是股票/货币/加密货币价格数据),您可以使用以下内容:

df.index = df.index.tz_localize(None)
df.to_excel(path)

只需将列转换为str

df['date'] = df['date'].astype(str)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM