【问题标题】:as.Date() R equivalent in Pythonas.Date() Python 中的 R 等效项
【发布时间】:2021-11-04 13:36:46
【问题描述】:

我正在尝试在 Python 中创建日期列表。 在 R 中,我有一个从 1:14975 开始的值列表,每个值代表一天,然后我将使用 time_id <- as.Date(time_id, origin=" 1979-01-01", tz= "UTC") 将值转换为日期。有没有办法在python中做到这一点?

【问题讨论】:

  • 你是指 1979 年还是 1970 年?
  • 我的意思是 1979 年,这有关系吗?
  • @LunaPaluna 我认为 Hong Ooi 的意思是 Unix 纪元从 1970 年开始,所以它可能是一个错字。在这种情况下可能很重要,因为'unix'is the default origin

标签: python r datetime


【解决方案1】:

Pandas pd.to_datetime() 做你想要的。

time_id = range(1, 14975)

df = pd.DataFrame()

df['dayID'] = pd.to_datetime(time_id, origin='1979-01-01', unit='D')

【讨论】:

  • 无需将范围具体化为列表,只需将范围生成器对象传递给pd.to_datetime。如果你真的需要从一个范围创建一个列表,调用list(range(...)) 就可以了。
  • 与:pd.date_range(start = '1979-01-01', periods = len(time_data)).to_pydatetime().tolist() 有什么区别?
  • 我认为对于您正在寻找的任务,使用to_datetime() 将数字解析为时间序列或使用date_range() 生成时间跨度序列之间没有区别,因为两者都是Numpy datetime64 dtypes,但是,to_pydatetime() 确实将 Pandas 系列再次更改为 Numpy 数据时间数组,然后更改为列表。太冗长了。
【解决方案2】:

你可以用 datetime 模块做类似的事情(虽然 pandas 匹配 R API):

from datetime import datetime, timedelta

time_id = [timedelta(days=x) + datetime(1970, 1, 1) for x in range(14975)]

【讨论】:

    【解决方案3】:

    如果我理解正确

    time_id <- as.Date(1:14975, origin='1979-01-01', tz='UTC')
    

    将使time_id 成为Date 对象的向量,其行为类似于具有公历表示的整数。但是它可以有分数,这些分数在所述表示中会被忽略,但在均值、加法和减法的计算中不会。

    严格来说,Python 中没有这样的东西。 datetime 模块中的主要内容是:

    • 日期(日历上的一天)
    • datetime(时间线上的一个点,可以是幼稚的,也可以是有时区的)
    • timedelta(时间点之间的差异,不要与时间段混淆,可以将其视为时间线的一部分)
    • tzinfo(与 UTC 的偏移量(作为 timedelta),其名称可能类似于“CET”)

    鉴于日期与时间无关,我不清楚将 tz='UTC' 传递到 as.Date 应该意味着什么。

    如果我们将 Python 列表大致等同于 R 向量(可以通过下标和切片来获取其成员的某个序列)。那么

    from datetime import date, timedelta
    
    origin = date(1979, 1, 1)
    time_id = [origin + timedelta(days=x) for x in range(1,14975)]
    

    将在语义上接近您的 R 代码。也就是说,sum(time_id) 将引发 TypeError,并且您有一个表示日历上日期的类型序列。

    如果您希望您的数据显示它们是 UTC,它们需要是时间点:

    from datetime import datetime, timedelta, timezone
    # timezone.utc is a convenient tzinfo
    origin = datetime(1979, 1, 1, tzinfo=timezone.utc)
    # origin will get a time of 00:00:00, or midnight on that date in
    # the designated timezone
    time_id = [origin + timedelta(days=x) for x in range(1, 14975)
    

    当您将 R 代码移植到 Python 时,pandas 包提供了一个高性能的 DataFrame 实现,可以像 R 一样执行矢量化操作。 Pandas 的灵感来自于 R。

    获得你想要的东西的一种方法是:

    import pandas as pd
    
    time_id: pd.DatetimeIndex  # typehint for clarity
    time_id = pd.to_datetime(range(1, 14975), origin="1979-01-01", unit="D", utc=True)
    

    熊猫documentation on Time series/date functionality是一个 不错的读物,有助于掌握不同的时间相关概念。

    附言。起初,我编辑了其他答案1,2 以返回 UTC 日期时间,而不是他们现在所做的时区天真日期时间。但是我写的评论变得有点庞大和复杂,所以我决定再写一个答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      相关资源
      最近更新 更多