当前位置: 首页 > 面试题库 >

Windows上日期为1970-01-01之前的datetime timestamp()的变通办法

戚晨
2023-03-14
问题内容

我目前正在尝试通过将日期转换为时间戳来在数据集中生成数字特征。如果在Mac上运行,它可以完美运行,在Windows上,它会抛出:

OS Error: [Errno 22] Invalid argument

这可能是由于Windows不支持1970-01-01之前的unix时间戳。我的约会日期从1955年开始。这是我的代码:

import time
import datetime

current_timestamp = time.time()
df.loc[:, "FEATURE_num"] = df["FEATURE"].apply(lambda d: datetime.datetime.strptime(d, '%Y-%m-%d').timestamp() if isinstance(d, str) else current_timestamp)

我在某处看到建议使用datetime.timedelta(),但我不知道如何集成它。


问题答案:

您可以通过(隐式)使用datetime.timedelta计算“格雷戈里”时间戳来实现,该时间戳对于从1582年10月15日到现在的日期(或您想使用的其他“时代”)有效。

正如函数的文档字符串所指示的那样,默认情况下,日期字符串将使用'%Y-%m-%d'
strptime-like格式字符串参数进行解析,但可以覆盖该参数。

from datetime import datetime


GREGORIAN_EPOCH = datetime.strptime('1582-10-15', '%Y-%m-%d')


def gregorian_timestamp(date, format='%Y-%m-%d'):
    """ Calculate timestamp using start of Gregorian calender as epoch.

        The date parameter can be either a string or a datetime.datetime
        object. Strings will be parsed using the '%Y-%m-%d' format by default
        unless a different one is specfied via the optional format parameter.
    """
    try:
        date = datetime.strptime(date, format)
    except TypeError:
        pass
    return (date - GREGORIAN_EPOCH).total_seconds()  # The timedelta in seconds.


if __name__ == '__main__':

    current_date = datetime.now()
    timestamp = gregorian_timestamp(current_date)
    print('gregorian timestamp:', timestamp)  # -> gregorian timestamp: 13768250461.136208

    timestamp = gregorian_timestamp('1970-01-01')
    print('gregorian timestamp:', timestamp)  # -> gregorian timestamp: 12219292800.0

    timestamp = gregorian_timestamp('1955-02-28')
    print('gregorian timestamp:', timestamp)  # -> gregorian timestamp: 11750918400.0

    timestamp = gregorian_timestamp('1582-10-15')
    print('gregorian timestamp:', timestamp)  # -> gregorian timestamp: 0.0


 类似资料:
  • 问题内容: 我有一个日期格式为的表格。为了搜索数据库,我将日期格式转换为。但是当我显示它时。PHP代码如下: 为什么会这样呢?如何将其格式化为? 问题答案: 替换为:

  • 问题内容: 我正在使用具有以下格式mm / dd / yyyy的jquery datepicker,但我需要它是sql数据库的yyyy-mm-dd,所以我正在使用它。 与以下 不幸的是,无论输入什么,我都会在数据库中注册1970-01-01。有什么想法我做错了吗?非常感谢你的帮助。 问题答案: 当您从那里回来时,意味着时间戳不正确。该日期是UNIX时代。 当涉及到Javascript(在这种情况下

  • 在windows上的MongoDB Shell中,如果运行值为的查询 它实际上似乎在寻找 如果您直接在Mongo Shell中输入“new ISODate('0001-01-01T00:00:00Z')”,您可以在返回ISODate(“1901-01-01T00:00:00Z”)时看到正在进行的转换。 奇怪的是,当您使用“new Date”而不是“new ISODate”时,请输入: 它返回正确的

  • 我有一个外部配置单元表指向通过s3上的Spark作业编写的拼花文件,它有日期、时间戳字段,当我通过配置单元查询时,我会得到正确的日期 但是,当我通过运行在EMR集群版本(EMR-5.6.0)上的presto(版本0.170)运行它时,我看到所有的日期都是1970-01-01 通过presto进行Parquet查询的Hive中的时间戳字段是否存在任何未解决的问题?

  • 问题内容: 该的getTime()获取以毫秒为某一特定日期时间。能否可靠地用于18世纪的约会。我们使用Millis并将其存储在字符串变量中以备将来比较。过去可以使用多长时间有限制? 问题答案: 如果您要比较遥远的过去的日期/时间,我强烈建议您看一下JodaTime。或者实际上是任何类型的日期/时间比较和计算。这是一个很棒的图书馆! 不要依靠getTime()做你想做的事情。至少考虑使用Java的C

  • 问题内容: 我正在教堂里工作,以前有很多活动,这些活动从今天开始,如何存储日期? 这仅适用于以下日期,我如何存储今年之前的日期? 我应该使用哪种数据类型?现在,我已经把我列式 问题答案: 很好 它可以存储从1000到9999 AD的 值。 当您只需要一个日期值而没有时间部分时,将使用DATE类型。MySQL检索并以’YYYY-MM-DD’格式显示DATE值。支持的范围是“ 1000-01-01”至