来自 MongoDB ISODate 的 Pandas DatetimeIndex

2023-11-24

我在处理时间/时区时遇到一些困难。我有以下形式的原始 JSON 数据

{
  "Date": "28 Sep 2009 00:00:00",
  ....
}

然后将该数据加载到 MongoDB 中,并将日期的字符串表示形式转换为JavaScript 日期对象。这个转换为UTC时间结果为以下日期

{
  "_id": ObjectId("577a788f4439e17afd4e21f7"),
  "Date": ISODate("2009-09-27T23:00:00Z")
}

它“看起来”好像日期实际上已经向前移动了一天,我假设(可能是错误的)这是因为我的机器设置为爱尔兰标准时间.

然后我从 MongoDB 读取这些数据并用它来创建 pandas日期时间索引

idx =  pd.DatetimeIndex([x['Date'] for x in test_docs], freq='D')

这给了我

enter image description here

这是不正确的,因为时间尚未从 UTC 正确转换回本地时间。所以我按照中给出的解决方案进行操作这个答案

idx =  pd.DatetimeIndex([x['Date'] for x in test_docs], freq='D')
idx = idx.tz_localize(tz=tz.tzutc())
idx = idx.tz_convert(tz=tz.tzlocal())
frame = DataFrame(test_docs, index=idx)
frame = frame.drop('Date', 1)

这给了我正确的一天回来

enter image description here

I then 正常化DatetimeIndex 因此小时被删除,允许我按天对所有条目进行分组。

frame.groupby(idx).sum()

然而此时,奇怪的事情发生了。日期最终分组如下

enter image description here

但这并不反映框架中的日期

enter image description here

任何人都可以阐明我可能出错的地方吗?


对@ptrj的回复

明确使用我的时区作为字符串

idx =  pd.DatetimeIndex([x['Date'] for x in test_docs], freq='D')
idx = idx.tz_localize(tz=tz.tzutc())
idx = idx.tz_convert(tz='Europe/Dublin')
idx = idx.normalize()
frame = DataFrame(test_docs, index=idx)
...
...
aggregate = frame.groupby(idx).sum()
aggregate.plot()

这对我不起作用,它会导致以下情节

enter image description here

由于某种原因,2014 年的 groupby 没有正确分组,如下所示

enter image description here

如果相反,我使用

idx = idx.tz_convert(tz.gettz('Europe/Dublin'))

我遇到同样的问题

转换为对象

idx =  pd.DatetimeIndex([x['Date'] for x in test_docs], freq='D')
idx = idx.tz_localize(tz=tz.tzutc())
idx = idx.tz_convert(tz=tz.tzlocal())
idx = idx.normalize()
frame = DataFrame(test_docs, index=idx)
aggregate = frame.groupby(idx.astype(object)).sum()

这种方法似乎对我来说是正确的

enter image description here


我能够使用以下数据重现该错误:

idx0 = pd.date_range('2011-11-11', periods=4)
idx1 = idx0.tz_localize(tz.tzutc())
idx2 = idx1.tz_convert(tz.tzlocal())
df = pd.DataFrame([1, 2, 3, 4])

df.groupby(idx2).sum()
Out[20]: 
                           0
1970-01-01 00:00:00-05:00  9
2011-11-10 19:00:00-05:00  1

这是 pandas 代码深处的一个错误,专门与tz.tzlocal()。它还表现在:

idx2.tz_localize(None)
Out[27]: 
DatetimeIndex(['2011-11-10 19:00:00', '1970-01-01 00:00:00',
               '1970-01-01 00:00:00', '1970-01-01 00:00:00'],
              dtype='datetime64[ns]', freq='D')

您可以使用以下任一解决方案:

  • 明确使用您的时区作为字符串:

    idx2 = idx1.tz_convert(tz='Europe/Dublin')
    df.groupby(idx2).sum()
    Out[29]: 
                               0
    2011-11-11 00:00:00+00:00  1
    2011-11-12 00:00:00+00:00  2
    2011-11-13 00:00:00+00:00  3
    2011-11-14 00:00:00+00:00  4
    

    或者如果它不起作用:

    idx2 = idx1.tz_convert(tz.gettz('Europe/Dublin'))
    
  • 将其转换为对象:

    df.groupby(idx2.astype(object)).sum()
    Out[32]: 
                               0
    2011-11-10 19:00:00-05:00  1
    2011-11-11 19:00:00-05:00  2
    2011-11-12 19:00:00-05:00  3
    2011-11-13 19:00:00-05:00  4
    

基本上,转换为 DatetimeIndex 以外的任何内容tz=tz.local()应该管用。


EDIT: This bug刚刚在 pandas github 上修复。该修复将在 pandas 0.19 版本中提供。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

来自 MongoDB ISODate 的 Pandas DatetimeIndex 的相关文章

  • KFold 和 ShuffleSplit CV 有什么区别?

    看起来 KFold 每次迭代对象时都会生成相同的值 而 Shuffle Split 每次都会生成不同的索引 它是否正确 如果是这样 其中一个相对于另一个有什么用处 cv cross validation KFold 10 n folds 2
  • 为什么 tkinter / window.update 在我的程序中随着时间的推移变得更慢?

    我发现当我调用 window update 时 当向窗口写入的内容较少时 它的运行速度会更快 但后来 当我向窗口写入更多元素时 window update 需要更长的时间 请参阅下面的我的代码 您可以看到它在更新窗口之前一次向屏幕 100
  • 为什么在 Windows 中使用 GetConsoleScreenBufferInfoEx 时控制台窗口会缩小?

    我正在尝试使用 GetConsoleScreenBufferInfoEx 和 SetConsoleScreenBufferInfoEx 设置 Windows 命令行控制台的背景和前景色 我正在 Python 中使用 wintypes 进行此
  • 将 API 数据存储到 DataFrame 中

    我正在运行 Python 脚本来从 Interactive Brokers API 收集金融市场数据 连接到API后 终端打印出请求的历史数据 如何将数据保存到数据帧中而不是在终端中流式传输 from ibapi wrapper impor
  • 从命令行创建 MongoDB 用户

    我已经建立了一个 MongoDB 数据库admin仅具有管理权限的用户 无权读取或写入数据库 我现在想做的是 添加新数据库 并向该数据库添加一个新用户 并且 我需要从命令行执行此操作 所以我尝试 mongo admin u admin p
  • 使用 Scipy imsave 将 Numpy 数组保存到图像时保留未更改的数据

    使用 Scipy 保存二维 Numpy 数组 单个值 时toimage or imsave像素值与 Numpy 数组中的像素值不完全匹配 相反 在某些区域 主要是边缘 图像算法似乎使用某种插值 是否有一个选项可以停止插值并保留准确的数据 例
  • Python 正则表达式部分匹配或“hitEnd”

    我正在编写一个扫描器 因此我将任意字符串与正则表达式规则列表进行匹配 如果我可以模拟 Java hitEnd 功能 不仅知道正则表达式何时不匹配 还知道何时匹配 这将非常有用 can t匹配 当正则表达式匹配器在决定拒绝输入之前到达输入末尾
  • 在 matplotlib 中使用 yscale('log') 时缺少误差线

    在某些情况下 当使用对数刻度时 matplotlib 会错误地显示带有误差条的图 假设这些数据 例如在 pylab 内 s 19 0 20 0 21 0 22 0 24 0 v 36 5 66 814250000000001 130 177
  • Python 视频框架

    我正在寻找一个 Python 框架 它将使我能够播放视频并在该视频上绘图 用于标记目的 我尝试过 Pyglet 但这似乎效果不是特别好 在现有视频上绘图时 会出现闪烁 即使使用双缓冲和所有这些好东西 而且似乎没有办法在每帧回调期间获取视频中
  • Python正则表达式从字符串中获取浮点数

    我正在使用正则表达式来解析字符串中的浮点数 re findall a zA Z d d t 是我使用的代码 这段代码有问题 如果数字和任何字符之间没有空格 则不会解析该数字 例如 0 1 2 3 4 5 6 7 8 9 的预期输出为 0 1
  • 参数验证,Python 中的最佳实践[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 让我们举一个 API 的例子 def get abs directory self path if os path isdir path ret
  • Spark中的count和collect函数抛出IllegalArgumentException

    当我使用时抛出此异常时 我尝试在本地 Spark 上加载一个小数据集count 在 PySpark 中 take 似乎有效 我试图搜索这个问题 但没有找到原因 看来RDD的分区有问题 有任何想法吗 先感谢您 sc stop sc Spark
  • 如何在C++中列出Python模块的所有函数名称?

    我有一个 C 程序 我想导入一个 Python 模块并列出该模块中的所有函数名称 我该怎么做 我使用以下代码从模块中获取字典 PyDictObject pDict PyDictObject PyModule GetDict pModule
  • Jupyter Notebook:没有名为 pandas 的模块

    我搜索了其他问题 但没有找到任何有帮助的内容 大多数只是建议您使用 conda 或 pip 安装 pandas 在我的 jupyter 笔记本中 我试图导入 pandas import pandas as pd 但我收到以下错误 Modul
  • 如何检查日期时间是否发生在今天?

    有没有比下面的代码更好的 net 方法来检查 今天 是否发生了 DateTime if newsStory WhenAdded Day DateTime Now Day newsStory WhenAdded Month DateTime
  • 获取调用者文件的绝对路径

    假设我在不同的目录中有两个文件 1 py 比如说 在C FIRST FOLDER 1 py and 2 py 比如说 在C SECOND FOLDER 2 py 文件1 py进口2 py using sys path insert 0 pa
  • issubclass() 对从不同路径导入的同一类返回 False

    目的是实现某种插件框架 其中插件是同一基类 即 A 的子类 即 B 基类使用标准导入加载 而子类使用 imp load module 从众所周知的包 即 pkg 的路径加载 pkg init py mod1 py class A mod2
  • 在游戏中实现功能

    我在完成这部分作业时遇到了麻烦 我必须宣布游戏的获胜者 然后输入到函数中 输入所有 if 语句后 我必须创建一个函数def playGame 这必须包括 showRules user getUserChoice computer getCo
  • 从数据集的给定日期范围中提取属于一天的数据

    我有一个数据集 日期范围为 2018 年 1 月 12 日到 8 月 3 日 其中包含一些值 维数为my df数据框是 my df shape 9752 2 每行包含半小时频率 第一行开始于2018 01 12 my df iloc 0 D
  • 为什么用字符串和时间增量转置 DataFrame 会转换数据类型?

    这种行为对我来说似乎很奇怪 id列 字符串 在转置后转换为时间戳df如果另一列是时间增量 import pandas as pd df pd DataFrame id 00115 01222 32333 val 12 14 170 df v

随机推荐

  • 神秘的 Rails 错误几乎没有痕迹

    我们的一个爬虫遇到了一个奇怪的问题 有时它会抛出一个Rails FATAL某些请求出错 但跟踪非常有限 看起来像这样 2014 07 01 18 16 37 FATAL Rails ArgumentError invalid encodin
  • python 字典中长(str)键的效率

    我正在解析一些 xml 使用一些 python 3 4 代码 并希望检索节点中的文本及其 id 属性 例子 li Some text here li 我当前的代码仅围绕文本构建 我现在添加 id 但之前不需要 我正在循环浏览文本 句子列表
  • 为什么 Apache 在 XAMPP 安装中无法启动?

    我已经迈出了学习 PHP 的第一步 认为这将是朝着正确方向迈出的良好一步 不过 我需要一些有关安装 XAMPP 的帮助 我已经通过 Apache Friends 站点下载了该文件和所有内容 但是当我前往控制面板时 我收到了许多错误 这就是它
  • Python scapy 导入错误

    如果我在 python 源文件中包含以下行 from scapy all import 我收到这个错误 from scapy all import ImportError No module named all 这在 Console 和 I
  • 使用点路径键字符串访问 Ruby 哈希

    Rails I18n 库将 YAML 文件转换为可使用 t 函数通过点路径调用访问的数据结构 t one two three four 有谁知道如何使用 Ruby Hash 来做到这一点 或者只能直接通过 YAML 对象实现 只需在路径中的
  • MOV AX,CS 和 MOV DS,AX 的概念

    谁能解释一下这三个指令的功能吗 ORG 1000H MOV AX CS MOV DS AX 理论上我知道代码 数据和额外的段是什么 但是 它们在这个程序中是如何实现的 为什么整个段被移到另一个段中 MOV AX CS and MOV DS
  • 为什么识别 XOR 运算符的反向传播神经网络需要偏置神经元?

    我发布了一个question昨天关于我的 XOR 运算符的反向传播神经网络遇到的问题 我做了更多的工作 意识到这可能与没有偏置神经元有关 我的问题是 偏置神经元的一般作用是什么 它在识别 XOR 运算符的反向传播神经网络中的作用是什么 是否
  • nginx 上游代理的后备

    我在图像服务器集群前面有一个 nginx 实例 upstream img farm 1 server 10 0 1 1 server 10 0 1 2 server 10 0 1 3 server 10 0 1 4 etc location
  • 模块模式-如何将一个模块的代码拆分到不同的js文件中?

    对于模块模式 我正在做类似的事情 function namespace tons of code blabla window myGlobalNamespace 如何拆分代码 我可以想到几种方法 例如使用命名空间的层次结构 或者通过以下方式
  • 对数据帧的成对行进行操作

    我在 R 中有一个数据框 我想对所有行对执行计算 有没有比使用嵌套 for 循环更简单的方法 为了使这一点具体化 考虑一个包含十行的数据框 我想计算所有 45 个可能的对之间的分数差 gt data frame ID 1 10 Score
  • Visual Studio 是否可以默认折叠摘要部分

    Visual Studio 是否可以默认折叠方法和类的摘要部分 或者是否有一个命令可以折叠所有摘要部分而不折叠方法本身 我在下面提供了一个摘要部分的示例 Collapsed example Expanded Example 您将必须使用宏
  • Android 蓝牙 - 无法连接

    我正在开发一个使用蓝牙连接到设备并发送 接收数据的应用程序 我正在使用 Nexus One 手机进行所有测试 我从未能够建立从我的手机到任何设备的 SPP 串行端口 连接 但是 我have能够使用相当于 PuTTY 的 Mac 从设备 我的
  • 如何获得有关 antlr4-maven-plugin 的帮助

    antlr4 maven plugin 似乎不是 Antlr4 网站上的文档 这可能不会给你带来任何好处 就像对我一样 尝试这个 mvn org antlr antlr4 maven plugin help Ddetail true 生产
  • 跨 Java 和 Javascript 模板语言?

    似乎有很多 Java 模板语言 例如 JSP JSTL Freemarker Velocity 等 和 Javascript 模板语言 例如 Mustache Ext 的 XTemplate Jquery 模板等 但是是否有一种模板语言具有
  • 绘制圆锥时断开的曲面

    我想用 python 绘制曲面 z 1 x y 和 4z x y 我写了这段代码 from mpl toolkits mplot3d import axes3d import matplotlib pyplot as plt import
  • 如何在打印从文件读取的行时跳过额外的换行符?

    我正在从 stdin 读取 python 程序的输入 我已将一个文件对象分配给 stdin 输入的行数事先是未知的 有时程序可能只有 1 行 100 行 甚至根本没有行 import sys sys stdin open Input txt
  • 使用自定义键盘中可见的候选视图重新调整 UI

    我正在使用自定义键盘 我在 onCreateCandidatesView 中设置了 setCandidatesViewShown true 函数 问题是 UI 没有正确调整 任何帮助将不胜感激 以下是我所做的 Override public
  • 为什么是 HTML 十进制和 HTML 十六进制?

    我已经尝试在 Google 上搜索很长一段时间来寻找为什么 HTML 实体可以以 HTML 十进制或 HTML 十六进制编译的答案 所以我的问题是 HTML 十进制和 HTML 十六进制有什么区别 为什么有两个系统做同样的事情 最初 HTM
  • HTTP Get:只下载标头? (不支持HEAD)

    在我的代码中 我使用一些 Http Get 请求以流的形式下载一些文件 我使用以下代码 public String getClassName String url throws ClientProtocolException IOExcep
  • 来自 MongoDB ISODate 的 Pandas DatetimeIndex

    我在处理时间 时区时遇到一些困难 我有以下形式的原始 JSON 数据 Date 28 Sep 2009 00 00 00 然后将该数据加载到 MongoDB 中 并将日期的字符串表示形式转换为JavaScript 日期对象 这个转换为UTC