我有一个大型数据集,其中包含以下格式的各种日期信息:
- 1900年1月1日以来的天数- ex: 41213 -我相信这些来自Excel http://www.kirix.com/stratablog/jd-edwards-date-conversions-cyyddd
- YYDayofyear - ex 2012265
熟悉python的时间模块,strptime()方法,strftime()方法。但是,如果有一个python模块可以用来转换这些不寻常的日期格式,我不确定上面这些日期格式是如何调用的。
有没有人知道如何从这些不寻常的日期格式中获得%Y%M%D格式,而无需编写自己的计算器?
谢谢。
您可以尝试如下操作:
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日以来的天数。
这是一般的转换-不确定你的输入格式,但希望这可以调整以适应它
将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系统中,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)
这两种格式似乎都很容易使用。第一个,实际上,只是一个整数,你为什么不这样做呢?
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位数字?),但是一旦您了解了这一部分,它可以非常相似地完成。
根据http://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior,一年中的第几天是"%j",而第一种情况可以通过toordinal()和fromordinal()来解决:date.fromordinal(date(1900, 1, 1).toordinal() + x)
我觉得是timedelta。
import datetime
d = datetime.timedelta(days=41213)
start = datetime.datetime(year=1900, month=1, day=1)
the_date = start + d
对于第二个,您可以2012265[:4]
获取年份,并使用相同的方法。
编辑:参见%j
的答案
from datetime import datetime
df(['timeelapsed'])=(pd.to_datetime(df['timeelapsed'], format='%H:%M:%S') - datetime(1900, 1, 1)).dt.total_seconds()