Python 2.7 Pandas-Python2.7:如何将timeseries索引转换为一天中的秒数?

Python 2.7 Pandas-Python2.7:如何将timeseries索引转换为一天中的秒数?,python-2.7,pandas,time-series,Python 2.7,Pandas,Time Series,我试图将时间序列索引转换为一天中的秒数,即,随着时间的推移,秒数从0增加到86399。我目前可以恢复一天中的时间,但无法以矢量化方式将其转换为秒: df['timeofday'] = df.index.time 有什么想法吗?谢谢。当@Jeff指出我最初的回答误解了你在做什么时。但是下面的方法应该是可行的,并且是矢量化的。我的答案取决于numpydatetime64操作(从当前的datetime64中减去一天的开始,然后用timedelta64除以以获得秒数): 可能有点过头了,但这是我的答案

我试图将时间序列索引转换为一天中的秒数,即,随着时间的推移,秒数从0增加到86399。我目前可以恢复一天中的时间,但无法以矢量化方式将其转换为秒:

df['timeofday'] = df.index.time

有什么想法吗?谢谢。

当@Jeff指出我最初的回答误解了你在做什么时。但是下面的方法应该是可行的,并且是矢量化的。我的答案取决于numpy
datetime64
操作(从当前的
datetime64
中减去一天的开始,然后用
timedelta64
除以以获得秒数):


可能有点过头了,但这是我的答案:

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)

我用时区修改了KarlD对datetime的回答:

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)
或者


这将给你时间戳的第二部分,从一天开始算起的秒数-你需要减去一个标准化的日期,然后转换为秒。你是对的@Jeff,我误解了这个问题。我修正了我的答案,但它不是特别优雅。
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)