【发布时间】:2016-11-07 04:28:24
【问题描述】:
我在处理时间/时区时遇到了一些困难。我有表单的原始 JSON 数据
{
"Date": "28 Sep 2009 00:00:00",
....
}
然后将此数据加载到 MongoDB 中,并将日期的字符串表示形式转换为 JavaScript Date object。转换为UTC 时间会产生以下日期
{
"_id": ObjectId("577a788f4439e17afd4e21f7"),
"Date": ISODate("2009-09-27T23:00:00Z")
}
“看起来”好像日期实际上提前了一天,我假设(可能是错误的)这是因为我的机器设置为 Irish Standard Time。
然后我从 MongoDB 中读取这些数据并使用它来创建熊猫 DatetimeIndex
idx = pd.DatetimeIndex([x['Date'] for x in test_docs], freq='D')
这给了我
这是不正确的,因为时间尚未正确地从 UTC 转换回本地时间。所以我按照this answer中给出的解决方案@
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)
这给了我正确的一天
然后我 normalize DatetimeIndex 删除小时数,允许我按天对所有条目进行分组。
frame.groupby(idx).sum()
然而,此时发生了一些奇怪的事情。日期最终分组如下
但这并不反映框架中的日期
任何人都可以阐明我可能出错的地方吗?
回复@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()
这对我不起作用,它会导致以下情节
由于某种原因,2014 年的 groupby 没有正确分组,如下所示
如果相反,我使用
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()
这种方法似乎对我有效
【问题讨论】:
-
idx是frame中的列还是单独的索引?看起来idx与frame.index不一致(idx[0]与您粘贴的frame中的索引不匹配 - 如果它是真实数据)。如果您可以粘贴一个带有frame和idx的小示例,它会导致此错误,那将会很有帮助。 -
对不起,我应该说得更清楚。
idx是frame的索引。我更新了问题以反映这一点 -
嗯,时区的错误很奇怪。我无法重现它。也许这是另一个错误。
标签: python mongodb datetime pandas time