我有一个包含几(数亿)行的 DataFrame。我想有效地将日期时间转换为时间戳。我该怎么做?
我的样本 df
:
df = pd.DataFrame(index=pd.DatetimeIndex(start=dt.datetime(2016,1,1,0,0,1),
end=dt.datetime(2016,1,2,0,0,1), freq='H'))\
.reset_index().rename(columns={'index':'datetime'})
看起来像:
datetime
0 2016-01-01 00:00:01
1 2016-01-01 01:00:01
2 2016-01-01 02:00:01
3 2016-01-01 03:00:01
4 2016-01-01 04:00:01
现在,我使用 .apply()
将日期时间按值转换为时间戳,但如果我有几(数百)百万行,则需要很长时间(几个小时):
df['ts'] = df[['datetime']].apply(lambda x: x[0].timestamp(), axis=1).astype(int)
输出:
datetime ts
0 2016-01-01 00:00:01 1451602801
1 2016-01-01 01:00:01 1451606401
2 2016-01-01 02:00:01 1451610001
3 2016-01-01 03:00:01 1451613601
4 2016-01-01 04:00:01 1451617201
上面的结果就是我想要的。
如果我尝试使用 .dt
访问器 pandas.Series
然后我收到错误消息:
df['ts'] = df['datetime'].dt.timestamp
AttributeError: ‘DatetimeProperties’ 对象没有属性 ‘timestamp’
如果我尝试创建例如。使用 .dt
访问器的日期时间的日期部分然后它比使用 .apply()
:
df['date'] = df['datetime'].dt.date
输出:
datetime ts date
0 2016-01-01 00:00:01 1451602801 2016-01-01
1 2016-01-01 01:00:01 1451606401 2016-01-01
2 2016-01-01 02:00:01 1451610001 2016-01-01
3 2016-01-01 03:00:01 1451613601 2016-01-01
4 2016-01-01 04:00:01 1451617201 2016-01-01
我想要与时间戳类似的东西……
但我不太了解官方文档:它谈到“ 转换为时间戳”,但我在那里看不到任何时间戳;它只是谈论转换为日期时间 pd.to_datetime()
但不是时间戳……
pandas.Timestamp
构造函数也不起作用(返回以下错误):
df['ts2'] = pd.Timestamp(df['datetime'])
类型错误:无法将输入转换为时间戳
pandas.Series.to_timestamp
也与我想要的完全不同:
df['ts3'] = df['datetime'].to_timestamp
输出:
datetime ts ts3
0 2016-01-01 00:00:01 1451602801 <bound method Series.to_timestamp of 0 2016...
1 2016-01-01 01:00:01 1451606401 <bound method Series.to_timestamp of 0 2016...
2 2016-01-01 02:00:01 1451610001 <bound method Series.to_timestamp of 0 2016...
3 2016-01-01 03:00:01 1451613601 <bound method Series.to_timestamp of 0 2016...
4 2016-01-01 04:00:01 1451617201 <bound method Series.to_timestamp of 0 2016...
原文由 ragesz 发布,翻译遵循 CC BY-SA 4.0 许可协议
I think you need convert first to
numpy array
byvalues
and cast toint64
- output is inns
, so need divide by10 ** 9
:to_timestamp
用于从句点转换 为日期时间索引。