2017-10-20 71 views
0

我有一个Pandas DataFrame的列,它是一年中的分数日(DOY)。此列显示如下:将每年的小数部分转换为熊猫日期时间

   DOY 
0  200.749967 
1  200.791667 
2  200.833367 
3  200.874967 
4  200.916667 
5  200.958367 
6  200.999967 
7  201.041667 
     ...  
3491 627.166667 
3492 627.333367 
3493 627.499967 
3494 627.666667 
3495 627.833367 
3496 627.999967 
3497 628.166667 
3498 628.333367 
Name: DOY, Length: 3499, dtype: float64 

开始的一年是2011年,但DOY数据继续增加到2012年的值,而不会在新的一年重置为零。

如何将其转换为格式为“YYYY-MM-DD HH:MM:SS”的Pandas DatetimeIndex?

回答

2

我认为可以这样做的一种方法是将您的列转换为TimeDelta,然后将其添加到基准偏移量(2011/1/1)。

df.DOY = pd.to_datetime('2011-1-1') + pd.to_timedelta(df.DOY, unit='D') 
print(df.DOY) 
0  2011-07-20 17:59:57.148800 
1  2011-07-20 19:00:00.028800 
2  2011-07-20 20:00:02.908800 
3  2011-07-20 20:59:57.148800 
4  2011-07-20 22:00:00.028800 
5  2011-07-20 23:00:02.908800 
6  2011-07-20 23:59:57.148800 
7  2011-07-21 01:00:00.028800 
     ... 
3491 2012-09-19 04:00:00.028800 
3492 2012-09-19 08:00:02.908800 
3493 2012-09-19 11:59:57.148800 
3494 2012-09-19 16:00:00.028800 
3495 2012-09-19 20:00:02.908800 
3496 2012-09-19 23:59:57.148800 
3497 2012-09-20 04:00:00.028800 
3498 2012-09-20 08:00:02.908800 
Name: DOY, dtype: datetime64[ns] 

另一种方法是在their answer调用pd.to_datetimeorigin参数集,如agtoever所示。

+0

为什么不使用'to_datetime'了'origin'参数? – agtoever

+0

@agtoever好,我不知道你能。 (upvoted你的答案) –

+0

请参阅附加答案我补充说明为了给出正确的日期时间结果所需的1天偏移量。 – PJW

2

只要使用to_datetime与此时,相应的参数(read the manual):

>>> pandas.to_datetime([0,0.1,200,400,800], unit='D', origin=pandas.Timestamp('01-01-2011')) 

DatetimeIndex(['2011-01-01 00:00:00', '2011-01-01 02:24:00', '2011-07-20 00:00:00', '2012-02-05 00:00:00', '2013-03-11 00:00:00'], dtype='datetime64[ns]', freq=None) 
+0

感谢这显然是一个相当的,非常好的答案。不过,我接受@COLDSPEED的答案,其中包含特定的应用程序。但是肯定也赞同这一点。 – PJW

1

虽然接受的答案是DOY到日期时间转换正确的,有以前一直被忽视稍有不慎。

任何一年的1月1日午夜都是1.0。当你进行小数DOY时间时,1月1日12:00是DOY 1.5,1月2日00:00是DOY 2.0等...

如果您将DOY时间添加到基准偏移日期,上面的答案,结果时间向前偏移一天。例如,pd.to_datetime('2011-01-01') + pd.to_timedelta(df.DOY, unit='D'),以1.0开头的DOY系列会导致“2011-01-02”的开始日期不正确。这是约定的结果,DOY时间从1开始,而不是从0开始。有关更多信息,请参阅here

因此,正确答案(生产日期时间正确的结果)是:

df.DOY = pd.to_datetime('2011-1-1') + pd.to_timedelta(gps.DOY, unit='D') - pd.Timedelta(days=1) 
相关问题