.json 扩展文件 + 时间戳 + Pandas + Python
Posted
技术标签:
【中文标题】.json 扩展文件 + 时间戳 + Pandas + Python【英文标题】:.json extension file + timestamp + Pandas + Python 【发布时间】:2014-05-24 14:52:11 【问题描述】:我有一个 .json 文件扩展名 (logs.json),其中包含以下数据(我只显示其中的一部分,因为有超过 2,000 个条目):
["2012-03-01T00:05:55+00:00", "2012-03-01T00:06:23+00:00", "2012-03-01T00:06:52+00:00 ", "2012-03-01T00:11:23+00:00", "2012-03-01T00:12:47+00:00", "2012-03-01T00:12:54+00:00", “2012-03-01T00:16:14+00:00”、“2012-03-01T00:17:31+00:00”、“2012-03-01T00:21:23+00:00”、“2012 -03-01T00:21:26+00:00”、“2012-03-01T00:22:25+00:00”、“2012-03-01T00:28:24+00:00”、“2012-03” -01T00:31:21+00:00”、“2012-03-01T00:32:20+00:00”、“2012-03-01T00:33:32+00:00”、“2012-03-01T00” :35:21+00:00”、“2012-03-01T00:38:14+00:00”、“2012-03-01T00:39:24+00:00”、“2012-03-01T00:43 :12+00:00”、“2012-03-01T00:46:13+00:00”、“2012-03-01T00:46:31+00:00”、“2012-03-01T00:48:03” +00:00”、“2012-03-01T00:49:34+00:00”、“2012-03-01T00:49:54+00:00”、“2012-03-01T00:55:19+00” :00", "2012-03-01T00:56:27+00:00", "2012-03-01T00:56:32+00:00"]
使用 Pandas,我做到了:
import pandas as pd
logs = pd.read_json('logs.json')
logs.head()
我得到以下信息:
0
0 2012-03-01T00:05:55+00:00
1 2012-03-01T00:06:23+00:00
2 2012-03-01T00:06:52+00:00
3 2012-03-01T00:11:23+00:00
4 2012-03-01T00:12:47+00:00
[5 rows x 1 columns]
然后,为了分配正确的数据类型,包括 UTC 时区,我这样做:
logs = pd.to_datetime(logs[0], utc=True)
logs.head()
得到:
0 2012-03-01 00:05:55
1 2012-03-01 00:06:23
2 2012-03-01 00:06:52
3 2012-03-01 00:11:23
4 2012-03-01 00:12:47
Name: 0, dtype: datetime64[ns]
这是我的问题:
-
上述代码是否可以正确获取我的数据格式?
我的 UTC 时区去了哪里?如果我想创建一个具有相应 PST 时间的列并以数据框格式将其添加到此数据集中怎么办?
我似乎记得为了获得每天/每周或每年的计数,我需要在某处添加 .day、.week 或 .year(logs.day?),但我无法弄清楚,我我猜这是因为我的数据的当前形状。我如何获得每天的计数?星期?年?这样我就可以绘制数据?以及如何绘制数据?
对于从 R 过渡到使用 Python 进行数据分析的人来说,这些简单的问题似乎很难!希望大家帮忙!
【问题讨论】:
欢迎来到 SO。什么格式是正确的格式,你能清楚地指出你想要的格式是什么吗?举个例子就好了。 以后尽量限制你在一个问题中提出的问题数量(希望是一个),除非它们实际上只是澄清或太小以至于很容易回答。问题越复杂、涉及面越广,您就越有可能得不到答案。 会的!谢谢你的建议! 【参考方案1】:我认为这里的 tz 处理可能存在错误,这当然有可能默认转换(我很惊讶它不是,我怀疑这是因为它只是一个列表)。
In [21]: s = pd.read_json(js, convert_dates=[0], typ='Series') # more honestly this is a Series
In [22]: s.head()
Out[22]:
0 2012-03-01 00:05:55
1 2012-03-01 00:06:23
2 2012-03-01 00:06:52
3 2012-03-01 00:11:23
4 2012-03-01 00:12:47
dtype: datetime64[ns]
要获得年、月等的计数。我可能会使用 DatetimeIndex(目前类似日期的列没有年/月等方法,尽管我认为它们(c|sh)应该):
In [23]: dti = pd.DatetimeIndex(s)
In [24]: s.groupby(dti.year).size()
Out[24]:
2012 27
dtype: int64
In [25]: s.groupby(dti.month).size()
Out[25]:
3 27
dtype: int64
也许将数据视为时间序列更有意义:
In [31]: ts = pd.Series(1, dti)
In [32]: ts.head()
Out[32]:
2012-03-01 00:05:55 1
2012-03-01 00:06:23 1
2012-03-01 00:06:52 1
2012-03-01 00:11:23 1
2012-03-01 00:12:47 1
dtype: int64
这样你就可以使用重采样:
In [33]: ts.resample('M', how='sum')
Out[33]:
2012-03-31 27
Freq: M, dtype: int64
【讨论】:
@Kevin 是的,你可以分组dti.to_period('M')
。 Tbh,大多数时候您希望 datetime 成为索引,这样您就可以使用 TimeGrouper('M') 重新采样/分组。编辑:以上是 month 做小时使用'H'。
@Kevin 提出一个新问题可能会更好(网站有帮助),如果你这样做,请随时将 URL 放在这里!这么说,你可以做s.groupby([dti.day, dti.hour]).size()
,如果那是你所追求的?
@AndyHayden,感谢您的解释。我在这里发布了我的问题:***.com/questions/26186651。欣赏!!以上是关于.json 扩展文件 + 时间戳 + Pandas + Python的主要内容,如果未能解决你的问题,请参考以下文章
将 JSON 时间戳字符串转换为 pandas 数据框中的 python 日期
如何将 pandas 数据框导出为 json 并保留原始日期时间格式?