Pandas将日期时间转换为整数时间戳

49

在Python中考虑一个名为time的整数类型的列的pandas数据帧,我可以使用以下指令将其转换为datetime格式。

考虑到Python中的Pandas DataFrame,其中包含一个名为time的整数类型的列,我可以使用下面的指令将其转换为datetime格式。

df['time'] = pandas.to_datetime(df['time'], unit='s')

现在这列的条目是这样的:2019-01-15 13:25:43

如何将该字符串还原为整数时间戳值(表示从1970-01-01 00:00:00开始的秒数)?

我查看了pandas.Timestamp,但找不到用于转换的工具,并且我不能使用pandas.to_timedelta进行转换。

是否有适用于此转换的实用程序?


请查看以下链接以获取帮助:https://dev59.com/8m855IYBdhLWcg3wFADy - Yuca
5个回答

43
你可以使用 astype(int) 将数据类型转换为整数,然后除以 10**9 得到距离 Unix 纪元开始的秒数。
import pandas as pd
df = pd.DataFrame({'time': [pd.to_datetime('2019-01-15 13:25:43')]})
df_unix_sec = pd.to_datetime(df['time']).astype(int)/ 10**9
print(df_unix_sec)

1
这会很棒,但它没有给出预期的结果:我尝试了以下几行代码:df = pd.DataFrame({'time': [pd.to_datetime('2019-01-15 13:25:43')]})df['time'] = pandas.to_datetime(df['time'], unit='s',origin='unix')它没有返回任何错误,但我看不到列中有任何变化。 - roschach
@FrancescoBoi,其实一开始我误解了to_datetime的参数。你可以看看我在stackoverflow上提出的问题:https://dev59.com/nFQJ5IYBdhLWcg3wNjK4。所以如果你将它转换为`int`类型,那么它就能正常工作了 :) - A l w a y s S u n n y
哦,抱歉,我的意思是我也回答了这个问题。 - cs95
1
好的,如果你只需要添加一个除以10 ** 9的Unix时间戳,那我就删掉我的回答。 - cs95
3
在我的观点中,由于在除以10**9后得到了浮点类型,因此最好再添加一个转换:res = (pd.to_datetime(df['time'], unit='s').astype(int)/10**9).astype(int) - roschach
显示剩余4条评论

39

最简单的方法是使用.value

pd.to_datetime('1970-01-01').value

如果您想将其应用于整列,只需使用.apply

df['time'] = df['time'].apply(lambda x: x.value)

对于我的dask.compute()来说,.astype(int) 更快:df[col] = df[col].apply(lambda x: x.value, meta=(col, int)) # 1.0秒df[col] = df[col].astype(int) # 0.8秒 - undefined

9

timedelta64 上使用 .dt.total_seconds() 方法:

import pandas as pd
df = pd.DataFrame({'time': [pd.to_datetime('2019-01-15 13:25:43')]})

# pd.to_timedelta(df.time).dt.total_seconds() # Is deprecated
(df.time - pd.to_datetime('1970-01-01')).dt.total_seconds()

输出

0    1.547559e+09
Name: time, dtype: float64

8

您也可以使用.view(...)

import pandas as pd
df = pd.DataFrame({'time': [pd.to_datetime('2019-01-15 13:25:43')]})
df_unix_sec = pd.to_datetime(df['time']).view(int) // 10 ** 9
print(df_unix_sec)

使用.astype(int)进行强制类型转换,在 pandas 1.3.0 中已经被废弃,并会抛出警告:
FutureWarning: casting datetime64[ns] values to int64 with .astype(...) is deprecated and will raise in a future version. Use .view(...) instead.

3

像@Ignacio建议的那样,这是我用来转换为整数的代码:

df['time'] = df['time'].apply(lambda x: x.value)

然后,要将它取回:

df['time'] = df['time'].apply(pd.Timestamp)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接