Python tz 感知 str 到 datetime 对象以进行重采样计算

Posted

技术标签:

【中文标题】Python tz 感知 str 到 datetime 对象以进行重采样计算【英文标题】:Python tz aware str to datetime object for resample calculation 【发布时间】:2021-02-03 22:56:52 【问题描述】: 我有以下 tz 感知字符串。 我想对此数据使用 data.resample('D') 操作。 我无法将其转换为正确的格式。我尝试使用 pd.to_datetime,但尝试使用 resample 时出现以下错误。

TypeError:仅对 DatetimeIndex、TimedeltaIndex 或 PeriodIndex 有效,但获得了 'Index' 的实例

>>> test1['timestamp']
0        2017-01-03 08:30:00-06:00
1        2017-01-03 08:30:32-06:00
2        2017-01-03 08:30:42-06:00
3        2017-01-03 08:30:46-06:00
4        2017-01-03 08:30:52-06:00
                   ...            
65334    2017-12-29 14:55:02-06:00
65335    2017-12-29 14:55:26-06:00
65336    2017-12-29 14:55:54-06:00
65337    2017-12-29 14:59:23-06:00
65338    2017-12-29 14:59:46-06:00
Name: timestamp, Length: 65339, dtype: object

实现这一点的最佳方法是什么?

谢谢

【问题讨论】:

试过 pd.to_datetime 从 obj (string) 转换为 datetime dtype? 【参考方案1】:

您的错误消息以 仅在 DatetimeIndex、... 时有效。

所以在将 timestamp 列转换为 datetime 之后,创建 从中获取一个 DatetimeIndex(并保存以备将来使用):

ind = pd.DatetimeIndex(pd.to_datetime(df.timestamp))

结果是:

DatetimeIndex(['2017-01-03 08:30:00-06:00', '2017-01-03 08:30:32-06:00',
               '2017-01-03 08:30:42-06:00', '2017-01-03 08:30:46-06:00',
               '2017-01-03 08:30:52-06:00'],
              dtype='datetime64[ns, pytz.FixedOffset(-360)]', name='timestamp', freq=None)

或者也许你应该在你的 DataFrame 中设置索引,基于 上式:

wrk = df.set_index(pd.DatetimeIndex(pd.to_datetime(df.timestamp)))\
    .drop(columns=['timestamp'])

然后重新索引它(使用一些聚合函数),例如:

wrk.resample('15s').sum()

我将源 df 创建为:

                   timestamp  amount
0  2017-01-03 08:30:00-06:00      12
1  2017-01-03 08:30:32-06:00      14
2  2017-01-03 08:30:42-06:00      17
3  2017-01-03 08:30:46-06:00      19
4  2017-01-03 08:30:52-06:00      23

得到如下结果:

                           amount
timestamp                        
2017-01-03 08:30:00-06:00      12
2017-01-03 08:30:15-06:00       0
2017-01-03 08:30:30-06:00      31
2017-01-03 08:30:45-06:00      42

【讨论】:

以上是关于Python tz 感知 str 到 datetime 对象以进行重采样计算的主要内容,如果未能解决你的问题,请参考以下文章

可感知 tz 的日期时间序列在 pandas 系列应用(lambda)操作中产生基于 UTC 的 .date() 输出

在 Python 中获取随机时区感知日期时间

python datetime时区转换

区别 |Python str.split()和re.split()

python中datetime怎么设置时区

将原始时间转换为时区感知时间 (JST)