我想将一天(比如说88)和一年(比如说2004年)转换成其组成月份和最近的两种可能性中的数字:
如果月份的日期范围为1到14,则返回1,否则返回15
我这样做:
datetime.datetime(year, 1, 1) + datetime.timedelta(days - 1)
但是,这只是解决问题的一部分。第88天和2004年的最终结果应该是:
3月15日(月份是3月,最近的一天是3月15日)。
- 编辑:更改问题以反映我的意思是一年中的某一天而不是朱利安日
答案 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等)