Используйте lubridate, создайте вектор, начинающийся с известного месяца:
Тест: для этих чисел месяца предположим, что Jan = 1:
> m = c(1,2,6,7,9,10,11,12,0,99,NA)
do:
> require(lubridate)
> as.character(month(ymd(010101) + months(m-1),label=TRUE,abbr=TRUE))
[1] "Jan" "Feb" "Jun" "Jul" "Sep" "Oct" "Nov" "Dec" "Dec" "Mar" NA
, где (m-1)
- это то, что мы начинаем с даты в январе.
Чтобы увидеть, как это сравнивается:
> cbind(m,as.character(month(ymd(010101) + months(m-1),label=TRUE,abbr=TRUE)))
m
[1,] "1" "Jan"
[2,] "2" "Feb"
[3,] "6" "Jun"
[4,] "7" "Jul"
[5,] "9" "Sep"
[6,] "10" "Oct"
[7,] "11" "Nov"
[8,] "12" "Dec"
[9,] "0" "Dec"
[10,] "99" "Mar"
[11,] NA NA
Обратите внимание, что он интерпретирует месяц числа как mod-12, поэтому 99 отображает 3 (99 = 3 + (8 * 12)), а NA возвращает NA. Некоторые из уже опубликованных ответов не будут делать этого. -1 - ноябрь, так как 0 - декабрь
Повышение. DateTime имеет миллисекунду и представления наносекунды, ЕСЛИ базовая платформа поддерживает их. В то время как это использует платформу определенный код, это не допускает те детали в Ваш код.
Если это - грандиозное предприятие, у них действительно есть другой способ сделать независимое от платформы подвторое разрешение. Эта страница несколько абзацев вниз говорят о том, как сделать это.
(От Страницы)
Например, давайте предположим, что мы хотим создать использование количества, которое представляет десятые части секунды. Таким образом, каждая галочка составляет 0,1 секунды.
int number_of_tenths = 5;
//create a resolution independent count -- divide by 10 since there are
//10 tenths in a second.
int count = number_of_tenths*(time_duration::ticks_per_second()/10);
time_duration td(1,2,3,count); //01:02:03.5 //no matter the resolution settings
Нет портативного решения этой проблемы, так как ANSI C не определяет стандартную точную миллисекундой функцию времени. При использовании Windows можно использовать GetTickCount (), timeGetTime (), или QueryPerformanceCounter ()/QueryPerformanceFrequency (). Следует иметь в виду, что они имеют различную точность и различные затраты во время выполнения.
В других операционных системах существуют другие подобные функции; я не уверен, что они первое, что пришло на ум.
GetTickCount в Windows gettimeofday в *отклоняют QueryPerformanceCounter в Windows для лучшего разрешения (хотя GetTickCount должен сделать это),
Как другой сказали, нет портативного способа сделать это.
Что я делаю (На msvc ++, и linux/g ++), я использую следующий класс, которые используют QueryPerformanceCounter в Windows и gettimeofday на Linux. Это - класс таймера, который может получить Вас прошедшее время между двумя вызовами. Вы могли бы хотеть изменить его к соответствиям Ваши потребности.
#if defined(_MSC_VER)
# define NOMINMAX // workaround un bug dans windows.h qui define des macros
// "min" et "max" qui entrent en conflit avec la STL.
# include <windows.h>
#else
# include <sys/time.h>
#endif
namespace Utils
{
/**
* Implémente un chronométre qui mesure le temps etre deux appels.
*/
class CTimer
{
private:
# if defined(_MSC_VER)
LARGE_INTEGER m_depart;
# else
timeval m_depart;
# endif
public:
/**
* Démarre le timer.
*
* Cette fonction sert à démarrer le timer. Si le timer est déja
* démarrer, elle le redémarre simplement.
*/
inline void start()
{
# if defined(_MSC_VER)
QueryPerformanceCounter(&m_depart);
# else
gettimeofday(&m_depart, 0);
# endif
};
/**
* Retourne le nombre de secondes depuis le départ du timer.
*
* @return Nombre de secondes écoulés depuis le départ du timer
*/
inline float GetSecondes() const
{
# if defined(_MSC_VER)
LARGE_INTEGER now;
LARGE_INTEGER freq;
QueryPerformanceCounter(&now);
QueryPerformanceFrequency(&freq);
return (now.QuadPart - m_depart.QuadPart) / static_cast<float>(freq.QuadPart);
# else
timeval now;
gettimeofday(&now, 0);
return now.tv_sec - m_depart.tv_sec + (now.tv_usec - m_depart.tv_usec) / 1000000.0f;
# endif
};
};
}
Высокое разрешение, низко служебная синхронизация для процессоров Intel
Если Вы находитесь на аппаратных средствах Intel, вот то, как считать ЦП счетчик команд в реальном времени. Это скажет Вам количество циклов ЦП, выполняемых, так как процессор был загружен. Это - вероятно, счетчик с самыми прекрасными зернами, который можно получить для измерения производительности.
Обратите внимание, что это - количество циклов ЦП. На Linux можно получить скорость ЦП от/proc/cpuinfo и разделиться для получения числа секунд. Преобразование этого к двойному довольно удобно.
Когда я выполняю это на своем поле, я добираюсь
11867927879484732 11867927879692217 it took this long to call printf: 207485
Вот Руководство разработчика Intel, которое дает тонны детали.
#include < stdio.h > // stackoverflow bug: pre tag eats the filenames,
#include < stdint.h > // so i had to put spaces in the angle brackets
inline uint64_t rdtsc() {
uint32_t lo, hi;
__asm__ __volatile__ (
"xorl %%eax, %%eax\n"
"cpuid\n"
"rdtsc\n"
: "=a" (lo), "=d" (hi)
:
: "%ebx", "%ecx");
return (uint64_t)hi << 32 | lo;
}
main()
{
unsigned long long x;
unsigned long long y;
x = rdtsc();
printf("%lld\n",x);
y = rdtsc();
printf("%lld\n",y);
printf("it took this long to call printf: %lld\n",y-x);
}
Если Вы будете на Unix, то gettimeofday () возвратит секунды и микросекунды, до разрешения системных часов.
int gettimeofday(struct timeval *tv, struct timezone *tz);
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
#include <ctime>
clock_t elapsed = static_cast<double>(clock() / CLOCKS_PER_SEC);
истекший будет прошедшее процессорное время, в секундах.
разрешение является зависимым операционной системы, но обычно лучше, чем разрешение миллисекунды в большинстве систем.
Изучите методы QueryPerformanceCounter, если это для Windows.
Что-либо не в (c)time.h
заголовок требует определенных для ОС методов. Я полагаю, что все те методы, поддерживают предложение.
В чем ОС Вы работаете?
Библиотека Threading Building Blocks Intel имеет функцию для этого, но TBB в настоящее время только availble на Intel и клонах (то есть, это не доступно на SPARCs, PowerPC, ARM, и т.д.),