【问题标题】:Converting date formats python - Unusual date formats - Extract %Y%M%D转换日期格式 python - 不寻常的日期格式 - 提取 %Y%M%D
【发布时间】:2013-01-11 04:41:04
【问题描述】:

我有一个大型数据集,其中包含以下格式的各种日期信息:

熟悉python的时间模块,strptime()方法,strftime()方法。但是,如果有一个 python 模块可以用来转换这些不寻常的日期格式,我不确定上面的这些日期格式是什么。

知道如何在不编写我自己的计算器的情况下从这些不寻常的日期格式中获取 %Y%M%D 格式吗?

谢谢。

【问题讨论】:

  • 你的输入格式是什么???
  • “自 1900-01-01 以来的天数”不是 Excel 日期。在 Excel 中将数字 41213 格式化为日期会生成 2012-10-31,而不是 2012-11-02

标签: python date strftime strptime


【解决方案1】:

您可以尝试以下方法:

In [1]: import datetime

In [2]: s = '2012265'

In [3]: datetime.datetime.strptime(s, '%Y%j')
Out[3]: datetime.datetime(2012, 9, 21, 0, 0)

In [4]: d = '41213'

In [5]: datetime.date(1900, 1, 1) + datetime.timedelta(int(d))
Out[5]: datetime.date(2012, 11, 2)

第一个比较棘手,但它使用%j 参数来解释您提供的一年中的哪一天(在四位数年份之后,由%Y 表示)。第二个是自 1900 年 1 月 1 日以来的天数。

这是一般转换 - 不确定您的输入格式,但希望可以对其进行调整以适应它。

【讨论】:

  • 很棒的答案。不知道 %j 参数。谢谢
【解决方案2】:

关于 Excel 整数到 Python 日期时间位:

请注意,有两个 Excel 日期系统(一个基于 1900 年 1 月 1 日,另一个基于 1904 年 1 月 1 日);请参阅https://support.microsoft.com/en-us/help/214330/differences-between-the-1900-and-the-1904-date-system-in-excel 了解更多信息。

还要注意,系统不是从零开始的。因此,在 1900 系统中,1900 年 1 月 1 日是第 1 天(不是第 0 天)。

import datetime

EXCEL_DATE_SYSTEM_PC=1900
EXCEL_DATE_SYSTEM_MAC=1904

i = 42129  # Excel number for 5-May-2015
d = datetime.date(EXCEL_DATE_SYSTEM_PC, 1, 1) + datetime.timedelta(i-2)

【讨论】:

  • timedelta 减 2 是与 Excel 完美对齐的关键。这个答案比这里的其他答案更受欢迎(目前投票得更高!),因为它更准确。
【解决方案3】:

这两种格式似乎都非常易于使用。第一个,其实只是一个整数,那你干吗不干这种事呢?

import datetime

def days_since_jan_1_1900_to_datetime(d):
    return datetime.datetime(1900,1,1) + \
        datetime.timedelta(days=d)

对于第二个,详细信息取决于格式的确切定义方式(例如,即使天数少于 100 天,您是否总是期望年后有 3 位数字,或者是否有可能有 2 或 1 – 如果是这样,年份总是 4 位数吗?)但是一旦你把那部分记下来,它就可以非常相似地完成。

【讨论】:

    【解决方案4】:

    根据http://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior ,一年中的哪一天是“%j”,而第一种情况可以通过 toordinal() 和 fromordinal() 解决:date.fromordinal(date(1900, 1, 1).toordinal() + x)

    【讨论】:

      【解决方案5】:

      我认为是 timedelta。

      import datetime
      d = datetime.timedelta(days=41213)
      start = datetime.datetime(year=1900, month=1, day=1)
      the_date = start + d
      

      对于第二个,你可以2012265[:4]获取年份并使用相同的方法。

      编辑:第二次查看%j 的答案。

      【讨论】:

        【解决方案6】:
        from datetime import datetime 
        
        df(['timeelapsed'])=(pd.to_datetime(df['timeelapsed'], format='%H:%M:%S') - datetime(1900, 1, 1)).dt.total_seconds()
        

        【讨论】:

          猜你喜欢
          • 2023-03-08
          • 2021-02-26
          • 1970-01-01
          • 2014-04-27
          • 2010-12-23
          • 1970-01-01
          • 1970-01-01
          • 2018-05-25
          • 2019-08-16
          相关资源
          最近更新 更多