Pandas - Python 2.7:如何将时间序列索引转换为一天中的秒数?
Posted
技术标签:
【中文标题】Pandas - Python 2.7:如何将时间序列索引转换为一天中的秒数?【英文标题】:Pandas - Python 2.7: How convert timeseries index to seconds of the day? 【发布时间】:2014-07-15 18:28:24 【问题描述】:我正在尝试将时间序列索引转换为一天中的秒数,即随着时间的推移秒数从 0-86399 增加。我目前可以恢复一天中的时间,但无法以矢量化方式将其转换为秒:
df['timeofday'] = df.index.time
有什么想法吗?谢谢。
【问题讨论】:
【参考方案1】:正如@Jeff 指出的那样,我最初的回答误解了你在做什么。但是以下应该可以工作并且它是矢量化的。我的答案依赖于 numpy datetime64
操作(从当前的 datetime64
中减去一天的开始,并用 timedelta64
分隔以获得秒数):
>>> df
A
2011-01-01 00:00:00 -0.112448
2011-01-01 01:00:00 1.006958
2011-01-01 02:00:00 -0.056194
2011-01-01 03:00:00 0.777821
2011-01-01 04:00:00 -0.552584
2011-01-01 05:00:00 0.156198
2011-01-01 06:00:00 0.848857
2011-01-01 07:00:00 0.248990
2011-01-01 08:00:00 0.524785
2011-01-01 09:00:00 1.510011
2011-01-01 10:00:00 -0.332266
2011-01-01 11:00:00 -0.909849
2011-01-01 12:00:00 -1.275335
2011-01-01 13:00:00 1.361837
2011-01-01 14:00:00 1.924534
2011-01-01 15:00:00 0.618478
df['sec'] = (df.index.values
- df.index.values.astype('datetime64[D]'))/np.timedelta64(1,'s')
A sec
2011-01-01 00:00:00 -0.112448 0
2011-01-01 01:00:00 1.006958 3600
2011-01-01 02:00:00 -0.056194 7200
2011-01-01 03:00:00 0.777821 10800
2011-01-01 04:00:00 -0.552584 14400
2011-01-01 05:00:00 0.156198 18000
2011-01-01 06:00:00 0.848857 21600
2011-01-01 07:00:00 0.248990 25200
2011-01-01 08:00:00 0.524785 28800
2011-01-01 09:00:00 1.510011 32400
2011-01-01 10:00:00 -0.332266 36000
2011-01-01 11:00:00 -0.909849 39600
2011-01-01 12:00:00 -1.275335 43200
2011-01-01 13:00:00 1.361837 46800
2011-01-01 14:00:00 1.924534 50400
2011-01-01 15:00:00 0.618478 54000
【讨论】:
这将给你时间戳的第二部分现在从一天开始的秒数 - 你需要减去一个标准化日期然后转换为秒 你说得对@Jeff,我误解了这个问题。我修正了我的答案,但它不是特别优雅。【参考方案2】:可能有点过头了,但这是我的答案:
from pandas import date_range, Series, to_datetime
# Some test data
rng = date_range('1/1/2011 01:01:01', periods=3, freq='s')
df = Series(randn(len(rng)), index=rng).to_frame()
def sec_in_day(timestamp):
date = timestamp.date() # We get the date less the time
elapsed_time = timestamp.to_datetime() - to_datetime(date) # We get the time
return elapsed_time.total_seconds()
Series(df.index).apply(sec_in_day)
【讨论】:
【参考方案3】:我修改了 KarlD 对带有时区的日期时间的回答:
d = pd.DataFrame("t_naive":pd.date_range("20160101","20160102", freq = "2H"))
d['t_utc'] = d['t_naive'].dt.tz_localize("UTC")
d['t_ct'] = d['t_utc'].dt.tz_convert("America/Chicago")
print(d.head())
# t_naive t_utc t_ct
# 0 2016-01-01 00:00:00 2016-01-01 00:00:00+00:00 2015-12-31 18:00:00-06:00
# 1 2016-01-01 02:00:00 2016-01-01 02:00:00+00:00 2015-12-31 20:00:00-06:00
# 2 2016-01-01 04:00:00 2016-01-01 04:00:00+00:00 2015-12-31 22:00:00-06:00
# 3 2016-01-01 06:00:00 2016-01-01 06:00:00+00:00 2016-01-01 00:00:00-06:00
# 4 2016-01-01 08:00:00 2016-01-01 08:00:00+00:00 2016-01-01 02:00:00-06:00
KarlD 的回答给出了 UTC 中的秒数
s0 = (d["t_naive"].values - d["t_naive"].values.astype('datetime64[D]'))/np.timedelta64(1,'s')
s0
# array([ 0., 7200., 14400., 21600., 28800., 36000., 43200.,
# 50400., 57600., 64800., 72000., 79200., 0.])
s1 = (d["t_ct"].values - d["t_ct"].values.astype('datetime64[D]'))/np.timedelta64(1,'s')
s1
# array([ 0., 7200., 14400., 21600., 28800., 36000., 43200.,
# 50400., 57600., 64800., 72000., 79200., 0.])
对于当地时间的秒数,使用:
s2 = (d["t_ct"].view("int64") - d["t_ct"].dt.normalize().view("int64"))//pd.Timedelta(1, unit='s')
#use d.index.normalize() for index
s2.values
# array([64800, 72000, 79200, 0, 7200, 14400, 21600, 28800, 36000,
# 43200, 50400, 57600, 64800], dtype=int64)
或者,
s3 = d["t_ct"].dt.hour*60*60 + d["t_ct"].dt.minute*60+ d["t_ct"].dt.second
s3.values
# array([64800, 72000, 79200, 0, 7200, 14400, 21600, 28800, 36000,
# 43200, 50400, 57600, 64800], dtype=int64)
【讨论】:
以上是关于Pandas - Python 2.7:如何将时间序列索引转换为一天中的秒数?的主要内容,如果未能解决你的问题,请参考以下文章
Python 2.7_pandas连接MySQL数据处理_20161229
如何系统地学习Python 中 matplotlib,numpy,scipy,pandas
Python 3.4 和 2.7:无法为 python 3.4 安装 numpy 包
linux上的两个python版本。如何将 2.7 设为默认值