Используя DateTime в Для цикла, увеличивая дату не работает

Этот вопрос несколько лет, но я наткнулся на него, а это значит, что другие будут.

Библиотека / пакет readr имеет некоторые полезные функции. Один из них - хороший способ интерпретировать «грязные» столбцы, такие как.

library(readr)
read_csv("numbers\n800\n\"1,800\"\n\"3500\"\n6.5",
          col_types = list(col_numeric())
        )

Это дает

Источник: локальный фрейм данных [4 x 1]

  numbers
    (dbl)
1   800.0
2  1800.0
3  3500.0
4     6.5

Важным моментом при чтении файлов является либо предварительная обработка, как комментарий выше относительно sed, либо вы должны обрабатывать во время чтения. Часто, если вы пытаетесь исправить ситуацию после факта, есть некоторые опасные предположения, которые трудно найти. (Вот почему плоские файлы так злы в первую очередь.)

Например, если бы я не помечен col_types, я бы получил следующее:

> read_csv("numbers\n800\n\"1,800\"\n\"3500\"\n6.5")
Source: local data frame [4 x 1]

  numbers
    (chr)
1     800
2   1,800
3    3500
4     6.5

(Обратите внимание, что теперь это chr (character) вместо numeric.)

Или, что более опасно, если бы оно было достаточно длинным, и большинство ранних элементов не содержало запятые:

> set.seed(1)
> tmp <- as.character(sample(c(1:10), 100, replace=TRUE))
> tmp <- c(tmp, "1,003")
> tmp <- paste(tmp, collapse="\"\n\"")

(так, что последние несколько элементов выглядят так:)

\"5\"\n\"9\"\n\"7\"\n\"1,003"

Тогда вы найдете проблемы с чтением этой запятой вообще!

> tail(read_csv(tmp))
Source: local data frame [6 x 1]

     3"
  (dbl)
1 8.000
2 5.000
3 5.000
4 9.000
5 7.000
6 1.003
Warning message:
1 problems parsing literal data. See problems(...) for more details. 

21
задан Gallen 11 August 2010 в 17:40
поделиться

2 ответа

DateTime.AddDays возвращает новый экземпляр без изменения date. На данный момент вы выбрасываете этот новый экземпляр. Вместо этого вам нужно сделать:

for (DateTime date = DateTime.Now; futureDate.CompareTo(date) > 0; date = date.AddDays(1.0))
{
    // logic here
}

Кроме того, я не уверен, почему вы звоните CompareTo, когда вы можете использовать оператор <. Я не могу сказать, является ли CompareTo(date) > 0 правильным, не задумываясь об этом, в то время как намерение оператора < очевидно:

for (DateTime date = DateTime.Now; date < futureDate; date = date.AddDays(1.0))
{
    // logic here
}
62
ответ дан Tim Robinson 29 November 2019 в 06:25
поделиться

DateTime является неизменным. Изменить на: date = date.AddDays (1.0)

8
ответ дан Kirk Woll 29 November 2019 в 06:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: