[英]Convert fractional day of year to Pandas Datetime
我有一个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?
我可以想到的一种方法是将列转换为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]
另一种方法是使用origin
参数集调用pd.to_datetime
,正如agtoever在其答案中所示 。
虽然在将DOY转换为Datetime时接受的答案是正确的,但是有一个小错误被忽略了。
任何一年的1月1日午夜都是DOY 1.0。 当您进行小数DOY时,1月1日12:00是DOY 1。1,1月2日00:00是DOY 2.0等等...
如果您将DOY时间添加到基准偏移日期,如其他答案中所建议的那样,结果时间将向前偏移一天。 例如, pd.to_datetime('2011-01-01') + pd.to_timedelta(df.DOY, unit='D')
,DOY系列以1.0开头,导致开始日期为'2011-01 -02'这是不正确的。 这是DOY时间以1而不是0开始的惯例的结果。有关详细信息,请参阅此处 。
因此,正确的答案(产生正确的日期时间结果)是:
df.DOY = pd.to_datetime('2011-1-1') + pd.to_timedelta(gps.DOY, unit='D') - pd.Timedelta(days=1)
只需使用适当参数的to_datetime
( 阅读手册 ):
>>> 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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.