在python转换日的一年到一个月和两个星期

时间:2015-12-23 04:38:38

标签: python datetime pandas

我想将一天(比如说88)和一年(比如说2004年)转换成其组成月份和最近的两种可能性中的数字:

如果月份的日期范围为1到14,则返回1,否则返回15

我这样做:

datetime.datetime(year, 1, 1) + datetime.timedelta(days - 1)

但是,这只是解决问题的一部分。第88天和2004年的最终结果应该是:

3月15日(月份是3月,最近的一天是3月15日)。

- 编辑:更改问题以反映我的意思是一年中的某一天而不是朱利安日

3 个答案:

答案 0 :(得分:2)

怎么样......

tmp_date = datetime.datetime(year, 1, 1) + datetime.timedelta(days - 1)
rday = 1 if tmp_date.day < 15 else 15
result = datetime.datetime(tmp_date.year, tmp_date.month, rday)

答案 1 :(得分:2)

您可以使用替换方法:

In [11]: d
Out[11]: datetime.datetime(2004, 3, 28, 0, 0)

In [12]: d.replace(day=1 if d.day < 15 else 15)
Out[12]: datetime.datetime(2004, 3, 15, 0, 0)

In [13]: t = pd.Timestamp(d)

In [14]: t.replace(day=1 if t.day < 15 else 15)
Out[14]: Timestamp('2004-03-15 00:00:00')

返回新日期而不是更新的原因是因为datetime对象是不可变的(它们无法更新)。

注意:该月的那一天有一个format

In [21]: datetime.datetime.strptime("2004+88", "%Y+%j")
Out[21]: datetime.datetime(2004, 3, 28, 0, 0)

In [22]: pd.to_datetime("2004+88", format="%Y+%j")
Out[22]: Timestamp('2004-03-28 00:00:00')

答案 2 :(得分:2)

这样的东西?

year = 2015
day = 88
d = dt.datetime(year, 1, 1) + dt.timedelta(88 - 1)

>>> d.month, 1 if d.day < 15 else 15
(3, 15)

根据您的要求,将元组对转换为有用的东西很容易。

例如

dt.datetime(year, d.month, 1 if d.day < 15 else 15).strftime('%Y-%b-%d')
'2015-Mar-15'

但是,您尚未指定所期望的数据类型(datetime.date,pd.Timestamp,string等)

相关问题