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 设为默认值

如何将关键字参数添加到 Python 2.7 中的包装函数?

在 python 2.7 中运行 Apriori 算法