熊猫日期时间到 unix 时间戳秒
Posted
技术标签:
【中文标题】熊猫日期时间到 unix 时间戳秒【英文标题】:pandas datetime to unix timestamp seconds 【发布时间】:2019-06-16 05:31:09 【问题描述】:从pandas.to_datetime的官方文档我们可以说,
unit : string, default ‘ns’
arg 的单位 (D,s,ms,us,ns) 表示单位,为整数或 浮点数。这将基于原点。 例如,与 unit='ms' 和 origin='unix' (默认),这将计算 到 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'],unit='ms',origin='unix')
print(df)
print(df_unix_sec)
time
0 2019-01-15 13:25:43
0 2019-01-15 13:25:43
Name: time, dtype: datetime64[ns]
后一个的输出没有变化。每次它显示的日期时间值不是毫秒数到 unix 纪元开始的第二个。这是为什么?我错过了什么吗?
【问题讨论】:
【参考方案1】:我想你误解了这个论点的目的。 origin='unix'
的目的是将整数时间戳转换为 datetime
,而不是相反。
pd.to_datetime(1.547559e+09, unit='s', origin='unix')
# Timestamp('2019-01-15 13:30:00')
这里有一些选项:
选项1:整数除法
相反,您可以通过转换为整数(以获取纳秒)并除以 109 来获取时间戳。
pd.to_datetime(['2019-01-15 13:30:00']).astype(int) / 10**9
# Float64Index([1547559000.0], dtype='float64')
优点:
超级快缺点:
假设 pandas 内部存储日期的方式选项 2:熊猫推荐
Pandas docs推荐使用以下方法:
# create test data
dates = pd.to_datetime(['2019-01-15 13:30:00'])
# calculate unix datetime
(dates - pd.Timestamp("1970-01-01")) // pd.Timedelta('1s')
[out]:
Int64Index([1547559000], dtype='int64')
优点:
“惯用”,图书馆推荐缺点:
笨重 性能不如整数除法选项 3:pd.Timestamp
如果您有单个日期字符串,则可以使用pd.Timestamp
,如另一个答案所示:
pd.Timestamp('2019-01-15 13:30:00').timestamp()
# 1547559000.0
如果你必须强制多个日期时间(pd.to_datetime
是你唯一的选择),你可以初始化和映射:
pd.to_datetime(['2019-01-15 13:30:00']).map(pd.Timestamp.timestamp)
# Float64Index([1547559000.0], dtype='float64')
优点:
单个日期时间字符串的最佳方法 容易记住缺点:
性能不如整数除法【讨论】:
哦,现在明白了 :) 请注意,推荐的方法会丢失精度。在我们这个世纪,大约 5-6% 的亚秒级精度时间戳不会进行从 float64 秒到pd.Timestamp
并返回到 float64 秒的可靠往返转换。您需要按十亿进行除法,例如使用decimal.Decimal
获得完整的精度。
仅当日期为 UTC 时,推荐的方法也有效。 (dates - pd.Timestamp("1970-01-01", tz=dates.tz)) // pd.Timedelta('1s')
至少似乎给出了一个 int64 数组,但它与相应的 Unix 时间戳大约相差 9.6 小时。正如@akaihola 所说,我不确定这是一个无损的 Unix 时代——不确定为什么没有直接的方法?
抱歉应该是 `(dates - pd.Timestamp("1970-01-01", tz="UTC").astimezone(dates.tz)) // pd.Timedelta('1s ')' 但它仍然不是 Unix 时间戳
为什么这么糟糕的方法没人记得?不能简单点dates.to_unix(unit='s')
吗?【参考方案2】:
您可以使用 timestamp() method 将 POSIX 时间戳作为浮点数返回:
pd.Timestamp('2021-04-01').timestamp()
[Out]:
1617235200.0
pd.Timestamp('2021-04-01 00:02:35.234').timestamp()
[Out]:
1617235355.234
【讨论】:
这应该是现在接受的答案【参考方案3】:value
的 pandas Timestamp 属性持有 unix 纪元。该值以纳秒为单位。因此,您可以通过 1e3 或 1e6 转换为 ms 或 us。检查下面的代码。
import pandas as pd
date_1 = pd.to_datetime('2020-07-18 18:50:00')
print(date_1.value)
【讨论】:
欢迎来到 SO!感谢您花时间回答这个问题。您的解决方案是否比公认的答案更好/不同地回答了问题? 是的,我认为这是从 pandas datetime 获取 unix 时间戳的更简单方法。 pd.to_datetime 转换为 pd.Timestamp(用于单值输入),它使用类似于 unix 时间戳的方法,但单位是纳秒而不是秒。使用您的代码,我得到 1595098200000000000 作为输出。【参考方案4】:如果您从数据框中访问特定的 datetime64
对象,pandas 很可能会返回一个 Timestamp
对象,这实际上是 pandas 存储 datetime64
对象的方式。
您可以使用pd.Timestamp
对象的pd.Timestamp.to_datetime64()
方法将其转换为具有ns
精度的numpy.datetime64
对象。
【讨论】:
欢迎来到 SO!感谢您花时间回答这个问题。请仔细阅读OP的问题。您的解决方案是否比公认的答案更好/不同地回答了问题?以上是关于熊猫日期时间到 unix 时间戳秒的主要内容,如果未能解决你的问题,请参考以下文章