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() 输出