.json 文件 + 时间戳 + Pandas + Python

2 投票
1 回答
768 浏览
提问于 2025-04-18 02:14

我有一个后缀为 .json 的文件(logs.json),里面有一些数据(因为有超过2000条记录,所以我只展示了一部分):

["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]

我有几个问题:

  1. 上面的代码是否正确,可以让我得到正确格式的数据?
  2. 我的 UTC 时区去哪了?如果我想创建一个对应的 PST 时间列并把它加到这个数据集中,该怎么做?
  3. 我记得要获取每天、每周或每年的计数,我需要在某个地方加上 .day、.week 或 .year(比如 logs.day?),但我搞不清楚怎么做,我猜这可能是因为我当前数据的形状。我要怎么按天、按周、按年统计数据,以便绘制图表?我该如何绘制这些数据?

这些看似简单的问题,对一个从 R 转到 Python 进行数据分析的人来说却很难!希望大家能帮帮我!

1 个回答

3

我觉得这里的时区处理可能有问题,默认情况下应该进行转换(我很惊讶没有这样做,我猜是因为它只是一个列表)。

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的东西(目前日期类的列没有年份、月份等的方法,不过我觉得它们应该有这些功能)。

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

撰写回答