【问题标题】:pandas datetime to unix timestamp seconds熊猫日期时间到 unix 时间戳秒
【发布时间】: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 纪元开始的第二个。这是为什么?我错过了什么吗?

【问题讨论】:

    标签: python pandas datetime


    【解决方案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的问题。您的解决方案是否比公认的答案更好/不同地回答了问题?
    猜你喜欢
    • 2021-01-06
    • 2017-02-23
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    相关资源
    最近更新 更多