gpt4 book ai didi

python - 来自 MongoDB ISODate 的 Pandas DatetimeIndex

转载 作者:IT老高 更新时间:2023-10-28 13:29:33 25 4
gpt4 key购买 nike

我在处理时间/时区时遇到了一些困难。我有表单的原始 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 中读取这些数据并使用它来创建 pandas DatetimeIndex

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

这给了我

enter image description here

这是不正确的,因为时间尚未正确地从 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)

这给了我正确的一天

enter image description here

然后我normalize DatetimeIndex 因此删除了小时数,使我可以按天对所有条目进行分组。

frame.groupby(idx).sum()

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

enter image description here

但这并不反射(reflect)框架中的日期

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 代码中的一个 bug,只与 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

基本上,使用 tz=tz.local() 转换为 DatetimeIndex 以外的任何内容都可以。


编辑:这个bug刚刚在 pandas github 上修复。该修复程序将在 pandas 0.19 版本中提供。

关于python - 来自 MongoDB ISODate 的 Pandas DatetimeIndex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38201666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com