- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
升级到 Python 3.8 和 pandas 1.2.1 后,我观察到性能大幅下降。
下面的简单代码需要将近8分钟才能完成:
import sys
import pandas as pd
import csv
import datetime
pd.show_versions()
start = datetime.datetime(2020,1,1,0,0,0)
print(str(start))
data = { 'timestamp': [], 'i': []}
for i in range(0, 2000000):
data['timestamp'].append(str(start))
data['i'].append(i)
df = pd.DataFrame(data)
df['timestamp'] = pd.to_datetime(df['timestamp'])
df.set_index('timestamp', inplace=True)
print(df.tail(10), flush=True)
df.to_csv('/DATA1/TEMP/df.csv', sep=',', date_format='%Y-%m-%d %H:%M:%S', quoting=csv.QUOTE_ALL)
print("DONE", flush=True)
这个脚本在我的虚拟环境中的输出是:
/home/user/venv-test/lib/python3.8/site-packages/setuptools/distutils_patch.py:25: UserWarning: Distutils was imported before Setuptools. This usage is discouraged and may exhibit undesirable behaviors or errors. Please use Setuptools' objects directly or at least import Setuptools first.
warnings.warn(
INSTALLED VERSIONS
------------------
commit : 9d598a5e1eee26df95b3910e3f2934890d062caa
python : 3.8.7.final.0
python-bits : 64
OS : Linux
OS-release : 3.10.0-1062.el7.x86_64
Version : #1 SMP Wed Aug 7 18:08:02 UTC 2019
machine : x86_64
processor : x86_64
byteorder : little
LC_ALL : None
LANG : en_US.UTF-8
LOCALE : en_US.UTF-8
pandas : 1.2.1
numpy : 1.19.5
pytz : 2020.5
dateutil : 2.8.1
pip : 21.0
setuptools : 49.2.1
Cython : 0.29.21
pytest : None
hypothesis : None
sphinx : None
blosc : None
feather : None
xlsxwriter : None
lxml.etree : None
html5lib : None
pymysql : None
psycopg2 : 2.8.6 (dt dec pq3 ext lo64)
jinja2 : None
IPython : None
pandas_datareader: None
bs4 : None
bottleneck : None
fsspec : None
fastparquet : None
gcsfs : None
matplotlib : None
numexpr : None
odfpy : None
openpyxl : None
pandas_gbq : None
pyarrow : None
pyxlsb : None
s3fs : None
scipy : 1.6.0
sqlalchemy : None
tables : None
tabulate : None
xarray : None
xlrd : None
xlwt : None
numba : None
2020-01-01 00:00:00
timestamp
2020-01-01 1999990
2020-01-01 1999991
2020-01-01 1999992
2020-01-01 1999993
2020-01-01 1999994
2020-01-01 1999995
2020-01-01 1999996
2020-01-01 1999997
2020-01-01 1999998
2020-01-01 1999999
DONE
real 7m49.337s
user 7m39.805s
sys 0m14.665s
在我的生产环境中,这是在包含大约 20 列的数据帧上运行的,to_csv()
调用的时间从几分钟变成了 40 多个小时。
我在这里遗漏了什么明显的东西吗?或者在这个特定版本的 pandas 中可能存在一些已知错误?
我通过将文件转储到不同硬盘驱动器上的几个不同分区来检查我的系统是否不受 IO 限制。此外,该进程在将数据帧转储为 CSV 时保持 100% 的 CPU 使用率,这与 IO 绑定(bind)系统不一致。
最佳答案
date_format
并且 datetime
是索引引起的。date_format='%Y-%m-%d %H:%M:%S'
使过程变慢,因为它似乎没有被矢量化。
00:00:00
,pandas 不会显示该时间,但是如果时间不是 00:00:00
在列中,然后显示所有时间组件。
date_format
的文件,当所有的时间部分都是00:00:00
时,时间戳的格式将会是'% Y-%m-%d'
.start = datetime(2020,1,1,0,0,0)
df.to_csv('df.csv', sep=',', quoting=csv.QUOTE_ALL)
# resulting csv
"timestamp","i"
"2020-01-01","0"
"2020-01-01","1"
"2020-01-01","2"
date_format
的文件,当所有的时间部分都是00:00:01
时,时间戳的格式将会是'% Y-%m-%d %H:%M:%S'
.start = datetime(2020,1,1,0,0,1)
df.to_csv('df.csv', sep=',', quoting=csv.QUOTE_ALL)
# resulting csv
"timestamp","i"
"2020-01-01 00:00:01","0"
"2020-01-01 00:00:01","1"
"2020-01-01 00:00:01","2"
.to_csv()
之前设置格式解决问题,或者重置datetime
索引。df.index.strftime('%Y-%m-%d %H:%M:%S')
或 df[some column].dt.strftime( '%Y-%m-%d %H:%M:%S')
。'%Y-%m-%d %H:%M:%S'
已经是 datetime
dtype
的默认格式>,因此无需将 datetime
格式的列重新格式化为 string
。df.index = df.index.strftime('%Y-%m-%d %H:%M:%S')
df.to_csv('df.csv', sep=',', quoting=csv.QUOTE_ALL)
df.reset_index(inplace=True)
df.to_csv('df.csv', sep=',', date_format='%Y-%m-%d %H:%M:%S', index=False, quoting=csv.QUOTE_ALL)
datetime(2020,1,1,0,0,0)
已经是一个datetime
dtype
,所以没有理由做 df['timestamp'] = pd.to_datetime(df['timestamp'])
import pandas as pd
from datetime import datetime
cols = 2000000
df = pd.DataFrame({'i': range(cols)}, index=[datetime(2020,1,1,0,0,1)] * cols)
df.to_csv('df.csv', sep=',', quoting=csv.QUOTE_ALL)
关于python - pandas 1.2.1 to_csv performance with datetime 作为索引并设置 date_format,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65903287/
我正在尝试使用以下方法对 datetime.datetime 对象列表求和: from datetime import datetime, timedelta d= [datetime.datetim
我正在尝试这个 (datetime.datetime.today()-datetime.datetime.today()).days 给出 -1 并期待值 0 而不是我得到 -1。在这种情况下,我将结
如果我列一个时间增量的列表,平均值比我对这些增量的微秒值求平均时要大。为什么会这样呢?。赠送。这是Linux上的Python3.8.10。
考虑以下片段: import datetime print(datetime.datetime.now() - datetime.datetime.now()) 在 x86_64 Linux 下的 P
如何在 SQLAlchemy 查询中比较 DateTime 字段和 datetime.datetime 对象? 例如,如果我这样做 candidates = session.query(User).f
我收到以下错误: type object 'datetime.datetime' has no attribute 'datetime' 在下面一行: date = datetime.datetime
尝试找出如何将当前日期锁定为变量,以从输入的 self.birthday 中减去。我已经查看了各种示例和链接,但无济于事......建议? from datetime import datetime
您好,我有一些 datetime.datetime 格式的日期,我用它们来过滤带有 Pandas 时间戳的 Pandas 数据框。我刚刚尝试了以下方法并获得了 2 小时的偏移量: from datet
如果您调用 datetime.datetime.now(datetime.timezone.utc) 您会得到类似 datetime.datetime(2021, 9, 8, 1, 33, 19, 6
我正在使用 pywin32 读取/写入 Excel 文件。我在 Excel 中有一些日期,以 yyyy-mm-dd hh:mm:ss 格式存储。我想将它们作为 datetime.datetime 对象
据我所知,自 Unix 纪元(1970-01-01 00:00:00 UTC)以来的秒数在全局各地应该是相同的,因为它固定为 UTC。 现在,如果您所在的时区有几个小时 +/- UTC,为什么这样做会
我正在尝试添加 datetime.datetime 和 datetime.time 以获得一列。我正在尝试结合: import datetime as dt dt.datetime.combine(m
我有一个脚本需要在脚本的不同行执行以下操作: today_date = datetime.date.today() date_time = datetime.strp(date_time_string
我在 AppEngine 上收到 type object 'datetime.datetime' has no attribute 'datetime' 错误,提示日期时间类型,但我的导入是 impo
所以我一直在使用 python 语言制作东西。我遇到了一些不太容易理解的错误: TypeError: 'datetime.datetime' object is not subscriptable (
当我运行时 from datetime import date, time, timedelta date(2012, 11, 1) + timedelta(0, 3600) 结果是 datetime
我的目标是转换 utc进入loc : use chrono::{Local, UTC, TimeZone}; let utc = chrono::UTC::now(); let loc = chron
假设您有一个 datetime.date 对象,例如 datetime.date.today() 返回的对象。 稍后您还会得到一个表示时间的字符串,它补充了日期对象。 在 datetime.datet
我试过了 In [16]: import datetime In [17]: now = datetime.datetime.utcnow() In [18]: isinstance(now, dat
我有以下代码并且收到上述错误。由于我是 python 新手,因此无法理解此处的语法以及如何修复错误: if not start or date < start: start = date 最佳答案 有
我是一名优秀的程序员,十分优秀!